Subversion Repositories oidplus

Rev

Rev 1042 | Go to most recent revision | View as "text/javascript" | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /**
  2.  * Copyright (c) Tiny Technologies, Inc. All rights reserved.
  3.  * Licensed under the LGPL or a commercial license.
  4.  * For LGPL see License.txt in the project root for license information.
  5.  * For commercial licenses see https://www.tiny.cloud/
  6.  *
  7.  * Version: 5.10.8 (2023-10-19)
  8.  */
  9. (function () {
  10.     'use strict';
  11.  
  12.     var Cell = function (initial) {
  13.       var value = initial;
  14.       var get = function () {
  15.         return value;
  16.       };
  17.       var set = function (v) {
  18.         value = v;
  19.       };
  20.       return {
  21.         get: get,
  22.         set: set
  23.       };
  24.     };
  25.  
  26.     var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager');
  27.  
  28.     var get$5 = function (fullscreenState) {
  29.       return {
  30.         isFullscreen: function () {
  31.           return fullscreenState.get() !== null;
  32.         }
  33.       };
  34.     };
  35.  
  36.     var typeOf = function (x) {
  37.       var t = typeof x;
  38.       if (x === null) {
  39.         return 'null';
  40.       } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
  41.         return 'array';
  42.       } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
  43.         return 'string';
  44.       } else {
  45.         return t;
  46.       }
  47.     };
  48.     var isType$1 = function (type) {
  49.       return function (value) {
  50.         return typeOf(value) === type;
  51.       };
  52.     };
  53.     var isSimpleType = function (type) {
  54.       return function (value) {
  55.         return typeof value === type;
  56.       };
  57.     };
  58.     var isString = isType$1('string');
  59.     var isArray = isType$1('array');
  60.     var isBoolean = isSimpleType('boolean');
  61.     var isNullable = function (a) {
  62.       return a === null || a === undefined;
  63.     };
  64.     var isNonNullable = function (a) {
  65.       return !isNullable(a);
  66.     };
  67.     var isFunction = isSimpleType('function');
  68.     var isNumber = isSimpleType('number');
  69.  
  70.     var noop = function () {
  71.     };
  72.     var compose = function (fa, fb) {
  73.       return function () {
  74.         var args = [];
  75.         for (var _i = 0; _i < arguments.length; _i++) {
  76.           args[_i] = arguments[_i];
  77.         }
  78.         return fa(fb.apply(null, args));
  79.       };
  80.     };
  81.     var compose1 = function (fbc, fab) {
  82.       return function (a) {
  83.         return fbc(fab(a));
  84.       };
  85.     };
  86.     var constant = function (value) {
  87.       return function () {
  88.         return value;
  89.       };
  90.     };
  91.     var identity = function (x) {
  92.       return x;
  93.     };
  94.     function curry(fn) {
  95.       var initialArgs = [];
  96.       for (var _i = 1; _i < arguments.length; _i++) {
  97.         initialArgs[_i - 1] = arguments[_i];
  98.       }
  99.       return function () {
  100.         var restArgs = [];
  101.         for (var _i = 0; _i < arguments.length; _i++) {
  102.           restArgs[_i] = arguments[_i];
  103.         }
  104.         var all = initialArgs.concat(restArgs);
  105.         return fn.apply(null, all);
  106.       };
  107.     }
  108.     var never = constant(false);
  109.     var always = constant(true);
  110.  
  111.     var none = function () {
  112.       return NONE;
  113.     };
  114.     var NONE = function () {
  115.       var call = function (thunk) {
  116.         return thunk();
  117.       };
  118.       var id = identity;
  119.       var me = {
  120.         fold: function (n, _s) {
  121.           return n();
  122.         },
  123.         isSome: never,
  124.         isNone: always,
  125.         getOr: id,
  126.         getOrThunk: call,
  127.         getOrDie: function (msg) {
  128.           throw new Error(msg || 'error: getOrDie called on none.');
  129.         },
  130.         getOrNull: constant(null),
  131.         getOrUndefined: constant(undefined),
  132.         or: id,
  133.         orThunk: call,
  134.         map: none,
  135.         each: noop,
  136.         bind: none,
  137.         exists: never,
  138.         forall: always,
  139.         filter: function () {
  140.           return none();
  141.         },
  142.         toArray: function () {
  143.           return [];
  144.         },
  145.         toString: constant('none()')
  146.       };
  147.       return me;
  148.     }();
  149.     var some = function (a) {
  150.       var constant_a = constant(a);
  151.       var self = function () {
  152.         return me;
  153.       };
  154.       var bind = function (f) {
  155.         return f(a);
  156.       };
  157.       var me = {
  158.         fold: function (n, s) {
  159.           return s(a);
  160.         },
  161.         isSome: always,
  162.         isNone: never,
  163.         getOr: constant_a,
  164.         getOrThunk: constant_a,
  165.         getOrDie: constant_a,
  166.         getOrNull: constant_a,
  167.         getOrUndefined: constant_a,
  168.         or: self,
  169.         orThunk: self,
  170.         map: function (f) {
  171.           return some(f(a));
  172.         },
  173.         each: function (f) {
  174.           f(a);
  175.         },
  176.         bind: bind,
  177.         exists: bind,
  178.         forall: bind,
  179.         filter: function (f) {
  180.           return f(a) ? me : NONE;
  181.         },
  182.         toArray: function () {
  183.           return [a];
  184.         },
  185.         toString: function () {
  186.           return 'some(' + a + ')';
  187.         }
  188.       };
  189.       return me;
  190.     };
  191.     var from = function (value) {
  192.       return value === null || value === undefined ? NONE : some(value);
  193.     };
  194.     var Optional = {
  195.       some: some,
  196.       none: none,
  197.       from: from
  198.     };
  199.  
  200.     var __assign = function () {
  201.       __assign = Object.assign || function __assign(t) {
  202.         for (var s, i = 1, n = arguments.length; i < n; i++) {
  203.           s = arguments[i];
  204.           for (var p in s)
  205.             if (Object.prototype.hasOwnProperty.call(s, p))
  206.               t[p] = s[p];
  207.         }
  208.         return t;
  209.       };
  210.       return __assign.apply(this, arguments);
  211.     };
  212.  
  213.     var singleton = function (doRevoke) {
  214.       var subject = Cell(Optional.none());
  215.       var revoke = function () {
  216.         return subject.get().each(doRevoke);
  217.       };
  218.       var clear = function () {
  219.         revoke();
  220.         subject.set(Optional.none());
  221.       };
  222.       var isSet = function () {
  223.         return subject.get().isSome();
  224.       };
  225.       var get = function () {
  226.         return subject.get();
  227.       };
  228.       var set = function (s) {
  229.         revoke();
  230.         subject.set(Optional.some(s));
  231.       };
  232.       return {
  233.         clear: clear,
  234.         isSet: isSet,
  235.         get: get,
  236.         set: set
  237.       };
  238.     };
  239.     var unbindable = function () {
  240.       return singleton(function (s) {
  241.         return s.unbind();
  242.       });
  243.     };
  244.     var value = function () {
  245.       var subject = singleton(noop);
  246.       var on = function (f) {
  247.         return subject.get().each(f);
  248.       };
  249.       return __assign(__assign({}, subject), { on: on });
  250.     };
  251.  
  252.     var nativePush = Array.prototype.push;
  253.     var map = function (xs, f) {
  254.       var len = xs.length;
  255.       var r = new Array(len);
  256.       for (var i = 0; i < len; i++) {
  257.         var x = xs[i];
  258.         r[i] = f(x, i);
  259.       }
  260.       return r;
  261.     };
  262.     var each$1 = function (xs, f) {
  263.       for (var i = 0, len = xs.length; i < len; i++) {
  264.         var x = xs[i];
  265.         f(x, i);
  266.       }
  267.     };
  268.     var filter$1 = function (xs, pred) {
  269.       var r = [];
  270.       for (var i = 0, len = xs.length; i < len; i++) {
  271.         var x = xs[i];
  272.         if (pred(x, i)) {
  273.           r.push(x);
  274.         }
  275.       }
  276.       return r;
  277.     };
  278.     var findUntil = function (xs, pred, until) {
  279.       for (var i = 0, len = xs.length; i < len; i++) {
  280.         var x = xs[i];
  281.         if (pred(x, i)) {
  282.           return Optional.some(x);
  283.         } else if (until(x, i)) {
  284.           break;
  285.         }
  286.       }
  287.       return Optional.none();
  288.     };
  289.     var find$1 = function (xs, pred) {
  290.       return findUntil(xs, pred, never);
  291.     };
  292.     var flatten = function (xs) {
  293.       var r = [];
  294.       for (var i = 0, len = xs.length; i < len; ++i) {
  295.         if (!isArray(xs[i])) {
  296.           throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
  297.         }
  298.         nativePush.apply(r, xs[i]);
  299.       }
  300.       return r;
  301.     };
  302.     var bind$3 = function (xs, f) {
  303.       return flatten(map(xs, f));
  304.     };
  305.     var get$4 = function (xs, i) {
  306.       return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
  307.     };
  308.     var head = function (xs) {
  309.       return get$4(xs, 0);
  310.     };
  311.     var findMap = function (arr, f) {
  312.       for (var i = 0; i < arr.length; i++) {
  313.         var r = f(arr[i], i);
  314.         if (r.isSome()) {
  315.           return r;
  316.         }
  317.       }
  318.       return Optional.none();
  319.     };
  320.  
  321.     var keys = Object.keys;
  322.     var each = function (obj, f) {
  323.       var props = keys(obj);
  324.       for (var k = 0, len = props.length; k < len; k++) {
  325.         var i = props[k];
  326.         var x = obj[i];
  327.         f(x, i);
  328.       }
  329.     };
  330.  
  331.     var contains = function (str, substr) {
  332.       return str.indexOf(substr) !== -1;
  333.     };
  334.  
  335.     var isSupported$1 = function (dom) {
  336.       return dom.style !== undefined && isFunction(dom.style.getPropertyValue);
  337.     };
  338.  
  339.     var fromHtml = function (html, scope) {
  340.       var doc = scope || document;
  341.       var div = doc.createElement('div');
  342.       div.innerHTML = html;
  343.       if (!div.hasChildNodes() || div.childNodes.length > 1) {
  344.         console.error('HTML does not have a single root node', html);
  345.         throw new Error('HTML must have a single root node');
  346.       }
  347.       return fromDom(div.childNodes[0]);
  348.     };
  349.     var fromTag = function (tag, scope) {
  350.       var doc = scope || document;
  351.       var node = doc.createElement(tag);
  352.       return fromDom(node);
  353.     };
  354.     var fromText = function (text, scope) {
  355.       var doc = scope || document;
  356.       var node = doc.createTextNode(text);
  357.       return fromDom(node);
  358.     };
  359.     var fromDom = function (node) {
  360.       if (node === null || node === undefined) {
  361.         throw new Error('Node cannot be null or undefined');
  362.       }
  363.       return { dom: node };
  364.     };
  365.     var fromPoint = function (docElm, x, y) {
  366.       return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);
  367.     };
  368.     var SugarElement = {
  369.       fromHtml: fromHtml,
  370.       fromTag: fromTag,
  371.       fromText: fromText,
  372.       fromDom: fromDom,
  373.       fromPoint: fromPoint
  374.     };
  375.  
  376.     typeof window !== 'undefined' ? window : Function('return this;')();
  377.  
  378.     var DOCUMENT = 9;
  379.     var DOCUMENT_FRAGMENT = 11;
  380.     var ELEMENT = 1;
  381.     var TEXT = 3;
  382.  
  383.     var type = function (element) {
  384.       return element.dom.nodeType;
  385.     };
  386.     var isType = function (t) {
  387.       return function (element) {
  388.         return type(element) === t;
  389.       };
  390.     };
  391.     var isElement = isType(ELEMENT);
  392.     var isText = isType(TEXT);
  393.     var isDocument = isType(DOCUMENT);
  394.     var isDocumentFragment = isType(DOCUMENT_FRAGMENT);
  395.  
  396.     var cached = function (f) {
  397.       var called = false;
  398.       var r;
  399.       return function () {
  400.         var args = [];
  401.         for (var _i = 0; _i < arguments.length; _i++) {
  402.           args[_i] = arguments[_i];
  403.         }
  404.         if (!called) {
  405.           called = true;
  406.           r = f.apply(null, args);
  407.         }
  408.         return r;
  409.       };
  410.     };
  411.  
  412.     var DeviceType = function (os, browser, userAgent, mediaMatch) {
  413.       var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
  414.       var isiPhone = os.isiOS() && !isiPad;
  415.       var isMobile = os.isiOS() || os.isAndroid();
  416.       var isTouch = isMobile || mediaMatch('(pointer:coarse)');
  417.       var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');
  418.       var isPhone = isiPhone || isMobile && !isTablet;
  419.       var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
  420.       var isDesktop = !isPhone && !isTablet && !iOSwebview;
  421.       return {
  422.         isiPad: constant(isiPad),
  423.         isiPhone: constant(isiPhone),
  424.         isTablet: constant(isTablet),
  425.         isPhone: constant(isPhone),
  426.         isTouch: constant(isTouch),
  427.         isAndroid: os.isAndroid,
  428.         isiOS: os.isiOS,
  429.         isWebView: constant(iOSwebview),
  430.         isDesktop: constant(isDesktop)
  431.       };
  432.     };
  433.  
  434.     var firstMatch = function (regexes, s) {
  435.       for (var i = 0; i < regexes.length; i++) {
  436.         var x = regexes[i];
  437.         if (x.test(s)) {
  438.           return x;
  439.         }
  440.       }
  441.       return undefined;
  442.     };
  443.     var find = function (regexes, agent) {
  444.       var r = firstMatch(regexes, agent);
  445.       if (!r) {
  446.         return {
  447.           major: 0,
  448.           minor: 0
  449.         };
  450.       }
  451.       var group = function (i) {
  452.         return Number(agent.replace(r, '$' + i));
  453.       };
  454.       return nu$2(group(1), group(2));
  455.     };
  456.     var detect$3 = function (versionRegexes, agent) {
  457.       var cleanedAgent = String(agent).toLowerCase();
  458.       if (versionRegexes.length === 0) {
  459.         return unknown$2();
  460.       }
  461.       return find(versionRegexes, cleanedAgent);
  462.     };
  463.     var unknown$2 = function () {
  464.       return nu$2(0, 0);
  465.     };
  466.     var nu$2 = function (major, minor) {
  467.       return {
  468.         major: major,
  469.         minor: minor
  470.       };
  471.     };
  472.     var Version = {
  473.       nu: nu$2,
  474.       detect: detect$3,
  475.       unknown: unknown$2
  476.     };
  477.  
  478.     var detectBrowser$1 = function (browsers, userAgentData) {
  479.       return findMap(userAgentData.brands, function (uaBrand) {
  480.         var lcBrand = uaBrand.brand.toLowerCase();
  481.         return find$1(browsers, function (browser) {
  482.           var _a;
  483.           return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());
  484.         }).map(function (info) {
  485.           return {
  486.             current: info.name,
  487.             version: Version.nu(parseInt(uaBrand.version, 10), 0)
  488.           };
  489.         });
  490.       });
  491.     };
  492.  
  493.     var detect$2 = function (candidates, userAgent) {
  494.       var agent = String(userAgent).toLowerCase();
  495.       return find$1(candidates, function (candidate) {
  496.         return candidate.search(agent);
  497.       });
  498.     };
  499.     var detectBrowser = function (browsers, userAgent) {
  500.       return detect$2(browsers, userAgent).map(function (browser) {
  501.         var version = Version.detect(browser.versionRegexes, userAgent);
  502.         return {
  503.           current: browser.name,
  504.           version: version
  505.         };
  506.       });
  507.     };
  508.     var detectOs = function (oses, userAgent) {
  509.       return detect$2(oses, userAgent).map(function (os) {
  510.         var version = Version.detect(os.versionRegexes, userAgent);
  511.         return {
  512.           current: os.name,
  513.           version: version
  514.         };
  515.       });
  516.     };
  517.  
  518.     var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
  519.     var checkContains = function (target) {
  520.       return function (uastring) {
  521.         return contains(uastring, target);
  522.       };
  523.     };
  524.     var browsers = [
  525.       {
  526.         name: 'Edge',
  527.         versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
  528.         search: function (uastring) {
  529.           return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');
  530.         }
  531.       },
  532.       {
  533.         name: 'Chrome',
  534.         brand: 'Chromium',
  535.         versionRegexes: [
  536.           /.*?chrome\/([0-9]+)\.([0-9]+).*/,
  537.           normalVersionRegex
  538.         ],
  539.         search: function (uastring) {
  540.           return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');
  541.         }
  542.       },
  543.       {
  544.         name: 'IE',
  545.         versionRegexes: [
  546.           /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
  547.           /.*?rv:([0-9]+)\.([0-9]+).*/
  548.         ],
  549.         search: function (uastring) {
  550.           return contains(uastring, 'msie') || contains(uastring, 'trident');
  551.         }
  552.       },
  553.       {
  554.         name: 'Opera',
  555.         versionRegexes: [
  556.           normalVersionRegex,
  557.           /.*?opera\/([0-9]+)\.([0-9]+).*/
  558.         ],
  559.         search: checkContains('opera')
  560.       },
  561.       {
  562.         name: 'Firefox',
  563.         versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
  564.         search: checkContains('firefox')
  565.       },
  566.       {
  567.         name: 'Safari',
  568.         versionRegexes: [
  569.           normalVersionRegex,
  570.           /.*?cpu os ([0-9]+)_([0-9]+).*/
  571.         ],
  572.         search: function (uastring) {
  573.           return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');
  574.         }
  575.       }
  576.     ];
  577.     var oses = [
  578.       {
  579.         name: 'Windows',
  580.         search: checkContains('win'),
  581.         versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
  582.       },
  583.       {
  584.         name: 'iOS',
  585.         search: function (uastring) {
  586.           return contains(uastring, 'iphone') || contains(uastring, 'ipad');
  587.         },
  588.         versionRegexes: [
  589.           /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
  590.           /.*cpu os ([0-9]+)_([0-9]+).*/,
  591.           /.*cpu iphone os ([0-9]+)_([0-9]+).*/
  592.         ]
  593.       },
  594.       {
  595.         name: 'Android',
  596.         search: checkContains('android'),
  597.         versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
  598.       },
  599.       {
  600.         name: 'OSX',
  601.         search: checkContains('mac os x'),
  602.         versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]
  603.       },
  604.       {
  605.         name: 'Linux',
  606.         search: checkContains('linux'),
  607.         versionRegexes: []
  608.       },
  609.       {
  610.         name: 'Solaris',
  611.         search: checkContains('sunos'),
  612.         versionRegexes: []
  613.       },
  614.       {
  615.         name: 'FreeBSD',
  616.         search: checkContains('freebsd'),
  617.         versionRegexes: []
  618.       },
  619.       {
  620.         name: 'ChromeOS',
  621.         search: checkContains('cros'),
  622.         versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/]
  623.       }
  624.     ];
  625.     var PlatformInfo = {
  626.       browsers: constant(browsers),
  627.       oses: constant(oses)
  628.     };
  629.  
  630.     var edge = 'Edge';
  631.     var chrome = 'Chrome';
  632.     var ie = 'IE';
  633.     var opera = 'Opera';
  634.     var firefox = 'Firefox';
  635.     var safari = 'Safari';
  636.     var unknown$1 = function () {
  637.       return nu$1({
  638.         current: undefined,
  639.         version: Version.unknown()
  640.       });
  641.     };
  642.     var nu$1 = function (info) {
  643.       var current = info.current;
  644.       var version = info.version;
  645.       var isBrowser = function (name) {
  646.         return function () {
  647.           return current === name;
  648.         };
  649.       };
  650.       return {
  651.         current: current,
  652.         version: version,
  653.         isEdge: isBrowser(edge),
  654.         isChrome: isBrowser(chrome),
  655.         isIE: isBrowser(ie),
  656.         isOpera: isBrowser(opera),
  657.         isFirefox: isBrowser(firefox),
  658.         isSafari: isBrowser(safari)
  659.       };
  660.     };
  661.     var Browser = {
  662.       unknown: unknown$1,
  663.       nu: nu$1,
  664.       edge: constant(edge),
  665.       chrome: constant(chrome),
  666.       ie: constant(ie),
  667.       opera: constant(opera),
  668.       firefox: constant(firefox),
  669.       safari: constant(safari)
  670.     };
  671.  
  672.     var windows = 'Windows';
  673.     var ios = 'iOS';
  674.     var android = 'Android';
  675.     var linux = 'Linux';
  676.     var osx = 'OSX';
  677.     var solaris = 'Solaris';
  678.     var freebsd = 'FreeBSD';
  679.     var chromeos = 'ChromeOS';
  680.     var unknown = function () {
  681.       return nu({
  682.         current: undefined,
  683.         version: Version.unknown()
  684.       });
  685.     };
  686.     var nu = function (info) {
  687.       var current = info.current;
  688.       var version = info.version;
  689.       var isOS = function (name) {
  690.         return function () {
  691.           return current === name;
  692.         };
  693.       };
  694.       return {
  695.         current: current,
  696.         version: version,
  697.         isWindows: isOS(windows),
  698.         isiOS: isOS(ios),
  699.         isAndroid: isOS(android),
  700.         isOSX: isOS(osx),
  701.         isLinux: isOS(linux),
  702.         isSolaris: isOS(solaris),
  703.         isFreeBSD: isOS(freebsd),
  704.         isChromeOS: isOS(chromeos)
  705.       };
  706.     };
  707.     var OperatingSystem = {
  708.       unknown: unknown,
  709.       nu: nu,
  710.       windows: constant(windows),
  711.       ios: constant(ios),
  712.       android: constant(android),
  713.       linux: constant(linux),
  714.       osx: constant(osx),
  715.       solaris: constant(solaris),
  716.       freebsd: constant(freebsd),
  717.       chromeos: constant(chromeos)
  718.     };
  719.  
  720.     var detect$1 = function (userAgent, userAgentDataOpt, mediaMatch) {
  721.       var browsers = PlatformInfo.browsers();
  722.       var oses = PlatformInfo.oses();
  723.       var browser = userAgentDataOpt.bind(function (userAgentData) {
  724.         return detectBrowser$1(browsers, userAgentData);
  725.       }).orThunk(function () {
  726.         return detectBrowser(browsers, userAgent);
  727.       }).fold(Browser.unknown, Browser.nu);
  728.       var os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
  729.       var deviceType = DeviceType(os, browser, userAgent, mediaMatch);
  730.       return {
  731.         browser: browser,
  732.         os: os,
  733.         deviceType: deviceType
  734.       };
  735.     };
  736.     var PlatformDetection = { detect: detect$1 };
  737.  
  738.     var mediaMatch = function (query) {
  739.       return window.matchMedia(query).matches;
  740.     };
  741.     var platform = cached(function () {
  742.       return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch);
  743.     });
  744.     var detect = function () {
  745.       return platform();
  746.     };
  747.  
  748.     var is = function (element, selector) {
  749.       var dom = element.dom;
  750.       if (dom.nodeType !== ELEMENT) {
  751.         return false;
  752.       } else {
  753.         var elem = dom;
  754.         if (elem.matches !== undefined) {
  755.           return elem.matches(selector);
  756.         } else if (elem.msMatchesSelector !== undefined) {
  757.           return elem.msMatchesSelector(selector);
  758.         } else if (elem.webkitMatchesSelector !== undefined) {
  759.           return elem.webkitMatchesSelector(selector);
  760.         } else if (elem.mozMatchesSelector !== undefined) {
  761.           return elem.mozMatchesSelector(selector);
  762.         } else {
  763.           throw new Error('Browser lacks native selectors');
  764.         }
  765.       }
  766.     };
  767.     var bypassSelector = function (dom) {
  768.       return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;
  769.     };
  770.     var all$1 = function (selector, scope) {
  771.       var base = scope === undefined ? document : scope.dom;
  772.       return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom);
  773.     };
  774.  
  775.     var eq = function (e1, e2) {
  776.       return e1.dom === e2.dom;
  777.     };
  778.  
  779.     var owner = function (element) {
  780.       return SugarElement.fromDom(element.dom.ownerDocument);
  781.     };
  782.     var documentOrOwner = function (dos) {
  783.       return isDocument(dos) ? dos : owner(dos);
  784.     };
  785.     var parent = function (element) {
  786.       return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
  787.     };
  788.     var parents = function (element, isRoot) {
  789.       var stop = isFunction(isRoot) ? isRoot : never;
  790.       var dom = element.dom;
  791.       var ret = [];
  792.       while (dom.parentNode !== null && dom.parentNode !== undefined) {
  793.         var rawParent = dom.parentNode;
  794.         var p = SugarElement.fromDom(rawParent);
  795.         ret.push(p);
  796.         if (stop(p) === true) {
  797.           break;
  798.         } else {
  799.           dom = rawParent;
  800.         }
  801.       }
  802.       return ret;
  803.     };
  804.     var siblings$2 = function (element) {
  805.       var filterSelf = function (elements) {
  806.         return filter$1(elements, function (x) {
  807.           return !eq(element, x);
  808.         });
  809.       };
  810.       return parent(element).map(children).map(filterSelf).getOr([]);
  811.     };
  812.     var children = function (element) {
  813.       return map(element.dom.childNodes, SugarElement.fromDom);
  814.     };
  815.  
  816.     var isShadowRoot = function (dos) {
  817.       return isDocumentFragment(dos) && isNonNullable(dos.dom.host);
  818.     };
  819.     var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
  820.     var isSupported = constant(supported);
  821.     var getRootNode = supported ? function (e) {
  822.       return SugarElement.fromDom(e.dom.getRootNode());
  823.     } : documentOrOwner;
  824.     var getShadowRoot = function (e) {
  825.       var r = getRootNode(e);
  826.       return isShadowRoot(r) ? Optional.some(r) : Optional.none();
  827.     };
  828.     var getShadowHost = function (e) {
  829.       return SugarElement.fromDom(e.dom.host);
  830.     };
  831.     var getOriginalEventTarget = function (event) {
  832.       if (isSupported() && isNonNullable(event.target)) {
  833.         var el = SugarElement.fromDom(event.target);
  834.         if (isElement(el) && isOpenShadowHost(el)) {
  835.           if (event.composed && event.composedPath) {
  836.             var composedPath = event.composedPath();
  837.             if (composedPath) {
  838.               return head(composedPath);
  839.             }
  840.           }
  841.         }
  842.       }
  843.       return Optional.from(event.target);
  844.     };
  845.     var isOpenShadowHost = function (element) {
  846.       return isNonNullable(element.dom.shadowRoot);
  847.     };
  848.  
  849.     var inBody = function (element) {
  850.       var dom = isText(element) ? element.dom.parentNode : element.dom;
  851.       if (dom === undefined || dom === null || dom.ownerDocument === null) {
  852.         return false;
  853.       }
  854.       var doc = dom.ownerDocument;
  855.       return getShadowRoot(SugarElement.fromDom(dom)).fold(function () {
  856.         return doc.body.contains(dom);
  857.       }, compose1(inBody, getShadowHost));
  858.     };
  859.     var getBody = function (doc) {
  860.       var b = doc.dom.body;
  861.       if (b === null || b === undefined) {
  862.         throw new Error('Body is not available yet');
  863.       }
  864.       return SugarElement.fromDom(b);
  865.     };
  866.  
  867.     var rawSet = function (dom, key, value) {
  868.       if (isString(value) || isBoolean(value) || isNumber(value)) {
  869.         dom.setAttribute(key, value + '');
  870.       } else {
  871.         console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
  872.         throw new Error('Attribute value was not simple');
  873.       }
  874.     };
  875.     var set = function (element, key, value) {
  876.       rawSet(element.dom, key, value);
  877.     };
  878.     var get$3 = function (element, key) {
  879.       var v = element.dom.getAttribute(key);
  880.       return v === null ? undefined : v;
  881.     };
  882.     var remove = function (element, key) {
  883.       element.dom.removeAttribute(key);
  884.     };
  885.  
  886.     var internalSet = function (dom, property, value) {
  887.       if (!isString(value)) {
  888.         console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
  889.         throw new Error('CSS value must be a string: ' + value);
  890.       }
  891.       if (isSupported$1(dom)) {
  892.         dom.style.setProperty(property, value);
  893.       }
  894.     };
  895.     var setAll = function (element, css) {
  896.       var dom = element.dom;
  897.       each(css, function (v, k) {
  898.         internalSet(dom, k, v);
  899.       });
  900.     };
  901.     var get$2 = function (element, property) {
  902.       var dom = element.dom;
  903.       var styles = window.getComputedStyle(dom);
  904.       var r = styles.getPropertyValue(property);
  905.       return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
  906.     };
  907.     var getUnsafeProperty = function (dom, property) {
  908.       return isSupported$1(dom) ? dom.style.getPropertyValue(property) : '';
  909.     };
  910.  
  911.     var mkEvent = function (target, x, y, stop, prevent, kill, raw) {
  912.       return {
  913.         target: target,
  914.         x: x,
  915.         y: y,
  916.         stop: stop,
  917.         prevent: prevent,
  918.         kill: kill,
  919.         raw: raw
  920.       };
  921.     };
  922.     var fromRawEvent = function (rawEvent) {
  923.       var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));
  924.       var stop = function () {
  925.         return rawEvent.stopPropagation();
  926.       };
  927.       var prevent = function () {
  928.         return rawEvent.preventDefault();
  929.       };
  930.       var kill = compose(prevent, stop);
  931.       return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);
  932.     };
  933.     var handle = function (filter, handler) {
  934.       return function (rawEvent) {
  935.         if (filter(rawEvent)) {
  936.           handler(fromRawEvent(rawEvent));
  937.         }
  938.       };
  939.     };
  940.     var binder = function (element, event, filter, handler, useCapture) {
  941.       var wrapped = handle(filter, handler);
  942.       element.dom.addEventListener(event, wrapped, useCapture);
  943.       return { unbind: curry(unbind, element, event, wrapped, useCapture) };
  944.     };
  945.     var bind$2 = function (element, event, filter, handler) {
  946.       return binder(element, event, filter, handler, false);
  947.     };
  948.     var unbind = function (element, event, handler, useCapture) {
  949.       element.dom.removeEventListener(event, handler, useCapture);
  950.     };
  951.  
  952.     var filter = always;
  953.     var bind$1 = function (element, event, handler) {
  954.       return bind$2(element, event, filter, handler);
  955.     };
  956.  
  957.     var r = function (left, top) {
  958.       var translate = function (x, y) {
  959.         return r(left + x, top + y);
  960.       };
  961.       return {
  962.         left: left,
  963.         top: top,
  964.         translate: translate
  965.       };
  966.     };
  967.     var SugarPosition = r;
  968.  
  969.     var get$1 = function (_DOC) {
  970.       var doc = _DOC !== undefined ? _DOC.dom : document;
  971.       var x = doc.body.scrollLeft || doc.documentElement.scrollLeft;
  972.       var y = doc.body.scrollTop || doc.documentElement.scrollTop;
  973.       return SugarPosition(x, y);
  974.     };
  975.  
  976.     var get = function (_win) {
  977.       var win = _win === undefined ? window : _win;
  978.       if (detect().browser.isFirefox()) {
  979.         return Optional.none();
  980.       } else {
  981.         return Optional.from(win['visualViewport']);
  982.       }
  983.     };
  984.     var bounds = function (x, y, width, height) {
  985.       return {
  986.         x: x,
  987.         y: y,
  988.         width: width,
  989.         height: height,
  990.         right: x + width,
  991.         bottom: y + height
  992.       };
  993.     };
  994.     var getBounds = function (_win) {
  995.       var win = _win === undefined ? window : _win;
  996.       var doc = win.document;
  997.       var scroll = get$1(SugarElement.fromDom(doc));
  998.       return get(win).fold(function () {
  999.         var html = win.document.documentElement;
  1000.         var width = html.clientWidth;
  1001.         var height = html.clientHeight;
  1002.         return bounds(scroll.left, scroll.top, width, height);
  1003.       }, function (visualViewport) {
  1004.         return bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height);
  1005.       });
  1006.     };
  1007.     var bind = function (name, callback, _win) {
  1008.       return get(_win).map(function (visualViewport) {
  1009.         var handler = function (e) {
  1010.           return callback(fromRawEvent(e));
  1011.         };
  1012.         visualViewport.addEventListener(name, handler);
  1013.         return {
  1014.           unbind: function () {
  1015.             return visualViewport.removeEventListener(name, handler);
  1016.           }
  1017.         };
  1018.       }).getOrThunk(function () {
  1019.         return { unbind: noop };
  1020.       });
  1021.     };
  1022.  
  1023.     var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
  1024.  
  1025.     var global$1 = tinymce.util.Tools.resolve('tinymce.Env');
  1026.  
  1027.     var global = tinymce.util.Tools.resolve('tinymce.util.Delay');
  1028.  
  1029.     var fireFullscreenStateChanged = function (editor, state) {
  1030.       editor.fire('FullscreenStateChanged', { state: state });
  1031.       editor.fire('ResizeEditor');
  1032.     };
  1033.  
  1034.     var getFullscreenNative = function (editor) {
  1035.       return editor.getParam('fullscreen_native', false, 'boolean');
  1036.     };
  1037.  
  1038.     var getFullscreenRoot = function (editor) {
  1039.       var elem = SugarElement.fromDom(editor.getElement());
  1040.       return getShadowRoot(elem).map(getShadowHost).getOrThunk(function () {
  1041.         return getBody(owner(elem));
  1042.       });
  1043.     };
  1044.     var getFullscreenElement = function (root) {
  1045.       if (root.fullscreenElement !== undefined) {
  1046.         return root.fullscreenElement;
  1047.       } else if (root.msFullscreenElement !== undefined) {
  1048.         return root.msFullscreenElement;
  1049.       } else if (root.webkitFullscreenElement !== undefined) {
  1050.         return root.webkitFullscreenElement;
  1051.       } else {
  1052.         return null;
  1053.       }
  1054.     };
  1055.     var getFullscreenchangeEventName = function () {
  1056.       if (document.fullscreenElement !== undefined) {
  1057.         return 'fullscreenchange';
  1058.       } else if (document.msFullscreenElement !== undefined) {
  1059.         return 'MSFullscreenChange';
  1060.       } else if (document.webkitFullscreenElement !== undefined) {
  1061.         return 'webkitfullscreenchange';
  1062.       } else {
  1063.         return 'fullscreenchange';
  1064.       }
  1065.     };
  1066.     var requestFullscreen = function (sugarElem) {
  1067.       var elem = sugarElem.dom;
  1068.       if (elem.requestFullscreen) {
  1069.         elem.requestFullscreen();
  1070.       } else if (elem.msRequestFullscreen) {
  1071.         elem.msRequestFullscreen();
  1072.       } else if (elem.webkitRequestFullScreen) {
  1073.         elem.webkitRequestFullScreen();
  1074.       }
  1075.     };
  1076.     var exitFullscreen = function (sugarDoc) {
  1077.       var doc = sugarDoc.dom;
  1078.       if (doc.exitFullscreen) {
  1079.         doc.exitFullscreen();
  1080.       } else if (doc.msExitFullscreen) {
  1081.         doc.msExitFullscreen();
  1082.       } else if (doc.webkitCancelFullScreen) {
  1083.         doc.webkitCancelFullScreen();
  1084.       }
  1085.     };
  1086.     var isFullscreenElement = function (elem) {
  1087.       return elem.dom === getFullscreenElement(owner(elem).dom);
  1088.     };
  1089.  
  1090.     var ancestors$1 = function (scope, predicate, isRoot) {
  1091.       return filter$1(parents(scope, isRoot), predicate);
  1092.     };
  1093.     var siblings$1 = function (scope, predicate) {
  1094.       return filter$1(siblings$2(scope), predicate);
  1095.     };
  1096.  
  1097.     var all = function (selector) {
  1098.       return all$1(selector);
  1099.     };
  1100.     var ancestors = function (scope, selector, isRoot) {
  1101.       return ancestors$1(scope, function (e) {
  1102.         return is(e, selector);
  1103.       }, isRoot);
  1104.     };
  1105.     var siblings = function (scope, selector) {
  1106.       return siblings$1(scope, function (e) {
  1107.         return is(e, selector);
  1108.       });
  1109.     };
  1110.  
  1111.     var attr = 'data-ephox-mobile-fullscreen-style';
  1112.     var siblingStyles = 'display:none!important;';
  1113.     var ancestorPosition = 'position:absolute!important;';
  1114.     var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;';
  1115.     var bgFallback = 'background-color:rgb(255,255,255)!important;';
  1116.     var isAndroid = global$1.os.isAndroid();
  1117.     var matchColor = function (editorBody) {
  1118.       var color = get$2(editorBody, 'background-color');
  1119.       return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback;
  1120.     };
  1121.     var clobberStyles = function (dom, container, editorBody) {
  1122.       var gatherSiblings = function (element) {
  1123.         return siblings(element, '*:not(.tox-silver-sink)');
  1124.       };
  1125.       var clobber = function (clobberStyle) {
  1126.         return function (element) {
  1127.           var styles = get$3(element, 'style');
  1128.           var backup = styles === undefined ? 'no-styles' : styles.trim();
  1129.           if (backup === clobberStyle) {
  1130.             return;
  1131.           } else {
  1132.             set(element, attr, backup);
  1133.             setAll(element, dom.parseStyle(clobberStyle));
  1134.           }
  1135.         };
  1136.       };
  1137.       var ancestors$1 = ancestors(container, '*');
  1138.       var siblings$1 = bind$3(ancestors$1, gatherSiblings);
  1139.       var bgColor = matchColor(editorBody);
  1140.       each$1(siblings$1, clobber(siblingStyles));
  1141.       each$1(ancestors$1, clobber(ancestorPosition + ancestorStyles + bgColor));
  1142.       var containerStyles = isAndroid === true ? '' : ancestorPosition;
  1143.       clobber(containerStyles + ancestorStyles + bgColor)(container);
  1144.     };
  1145.     var restoreStyles = function (dom) {
  1146.       var clobberedEls = all('[' + attr + ']');
  1147.       each$1(clobberedEls, function (element) {
  1148.         var restore = get$3(element, attr);
  1149.         if (restore !== 'no-styles') {
  1150.           setAll(element, dom.parseStyle(restore));
  1151.         } else {
  1152.           remove(element, 'style');
  1153.         }
  1154.         remove(element, attr);
  1155.       });
  1156.     };
  1157.  
  1158.     var DOM = global$2.DOM;
  1159.     var getScrollPos = function () {
  1160.       return getBounds(window);
  1161.     };
  1162.     var setScrollPos = function (pos) {
  1163.       return window.scrollTo(pos.x, pos.y);
  1164.     };
  1165.     var viewportUpdate = get().fold(function () {
  1166.       return {
  1167.         bind: noop,
  1168.         unbind: noop
  1169.       };
  1170.     }, function (visualViewport) {
  1171.       var editorContainer = value();
  1172.       var resizeBinder = unbindable();
  1173.       var scrollBinder = unbindable();
  1174.       var refreshScroll = function () {
  1175.         document.body.scrollTop = 0;
  1176.         document.documentElement.scrollTop = 0;
  1177.       };
  1178.       var refreshVisualViewport = function () {
  1179.         window.requestAnimationFrame(function () {
  1180.           editorContainer.on(function (container) {
  1181.             return setAll(container, {
  1182.               top: visualViewport.offsetTop + 'px',
  1183.               left: visualViewport.offsetLeft + 'px',
  1184.               height: visualViewport.height + 'px',
  1185.               width: visualViewport.width + 'px'
  1186.             });
  1187.           });
  1188.         });
  1189.       };
  1190.       var update = global.throttle(function () {
  1191.         refreshScroll();
  1192.         refreshVisualViewport();
  1193.       }, 50);
  1194.       var bind$1 = function (element) {
  1195.         editorContainer.set(element);
  1196.         update();
  1197.         resizeBinder.set(bind('resize', update));
  1198.         scrollBinder.set(bind('scroll', update));
  1199.       };
  1200.       var unbind = function () {
  1201.         editorContainer.on(function () {
  1202.           resizeBinder.clear();
  1203.           scrollBinder.clear();
  1204.         });
  1205.         editorContainer.clear();
  1206.       };
  1207.       return {
  1208.         bind: bind$1,
  1209.         unbind: unbind
  1210.       };
  1211.     });
  1212.     var toggleFullscreen = function (editor, fullscreenState) {
  1213.       var body = document.body;
  1214.       var documentElement = document.documentElement;
  1215.       var editorContainer = editor.getContainer();
  1216.       var editorContainerS = SugarElement.fromDom(editorContainer);
  1217.       var fullscreenRoot = getFullscreenRoot(editor);
  1218.       var fullscreenInfo = fullscreenState.get();
  1219.       var editorBody = SugarElement.fromDom(editor.getBody());
  1220.       var isTouch = global$1.deviceType.isTouch();
  1221.       var editorContainerStyle = editorContainer.style;
  1222.       var iframe = editor.iframeElement;
  1223.       var iframeStyle = iframe.style;
  1224.       var handleClasses = function (handler) {
  1225.         handler(body, 'tox-fullscreen');
  1226.         handler(documentElement, 'tox-fullscreen');
  1227.         handler(editorContainer, 'tox-fullscreen');
  1228.         getShadowRoot(editorContainerS).map(function (root) {
  1229.           return getShadowHost(root).dom;
  1230.         }).each(function (host) {
  1231.           handler(host, 'tox-fullscreen');
  1232.           handler(host, 'tox-shadowhost');
  1233.         });
  1234.       };
  1235.       var cleanup = function () {
  1236.         if (isTouch) {
  1237.           restoreStyles(editor.dom);
  1238.         }
  1239.         handleClasses(DOM.removeClass);
  1240.         viewportUpdate.unbind();
  1241.         Optional.from(fullscreenState.get()).each(function (info) {
  1242.           return info.fullscreenChangeHandler.unbind();
  1243.         });
  1244.       };
  1245.       if (!fullscreenInfo) {
  1246.         var fullscreenChangeHandler = bind$1(owner(fullscreenRoot), getFullscreenchangeEventName(), function (_evt) {
  1247.           if (getFullscreenNative(editor)) {
  1248.             if (!isFullscreenElement(fullscreenRoot) && fullscreenState.get() !== null) {
  1249.               toggleFullscreen(editor, fullscreenState);
  1250.             }
  1251.           }
  1252.         });
  1253.         var newFullScreenInfo = {
  1254.           scrollPos: getScrollPos(),
  1255.           containerWidth: editorContainerStyle.width,
  1256.           containerHeight: editorContainerStyle.height,
  1257.           containerTop: editorContainerStyle.top,
  1258.           containerLeft: editorContainerStyle.left,
  1259.           iframeWidth: iframeStyle.width,
  1260.           iframeHeight: iframeStyle.height,
  1261.           fullscreenChangeHandler: fullscreenChangeHandler
  1262.         };
  1263.         if (isTouch) {
  1264.           clobberStyles(editor.dom, editorContainerS, editorBody);
  1265.         }
  1266.         iframeStyle.width = iframeStyle.height = '100%';
  1267.         editorContainerStyle.width = editorContainerStyle.height = '';
  1268.         handleClasses(DOM.addClass);
  1269.         viewportUpdate.bind(editorContainerS);
  1270.         editor.on('remove', cleanup);
  1271.         fullscreenState.set(newFullScreenInfo);
  1272.         if (getFullscreenNative(editor)) {
  1273.           requestFullscreen(fullscreenRoot);
  1274.         }
  1275.         fireFullscreenStateChanged(editor, true);
  1276.       } else {
  1277.         fullscreenInfo.fullscreenChangeHandler.unbind();
  1278.         if (getFullscreenNative(editor) && isFullscreenElement(fullscreenRoot)) {
  1279.           exitFullscreen(owner(fullscreenRoot));
  1280.         }
  1281.         iframeStyle.width = fullscreenInfo.iframeWidth;
  1282.         iframeStyle.height = fullscreenInfo.iframeHeight;
  1283.         editorContainerStyle.width = fullscreenInfo.containerWidth;
  1284.         editorContainerStyle.height = fullscreenInfo.containerHeight;
  1285.         editorContainerStyle.top = fullscreenInfo.containerTop;
  1286.         editorContainerStyle.left = fullscreenInfo.containerLeft;
  1287.         cleanup();
  1288.         setScrollPos(fullscreenInfo.scrollPos);
  1289.         fullscreenState.set(null);
  1290.         fireFullscreenStateChanged(editor, false);
  1291.         editor.off('remove', cleanup);
  1292.       }
  1293.     };
  1294.  
  1295.     var register$1 = function (editor, fullscreenState) {
  1296.       editor.addCommand('mceFullScreen', function () {
  1297.         toggleFullscreen(editor, fullscreenState);
  1298.       });
  1299.     };
  1300.  
  1301.     var makeSetupHandler = function (editor, fullscreenState) {
  1302.       return function (api) {
  1303.         api.setActive(fullscreenState.get() !== null);
  1304.         var editorEventCallback = function (e) {
  1305.           return api.setActive(e.state);
  1306.         };
  1307.         editor.on('FullscreenStateChanged', editorEventCallback);
  1308.         return function () {
  1309.           return editor.off('FullscreenStateChanged', editorEventCallback);
  1310.         };
  1311.       };
  1312.     };
  1313.     var register = function (editor, fullscreenState) {
  1314.       var onAction = function () {
  1315.         return editor.execCommand('mceFullScreen');
  1316.       };
  1317.       editor.ui.registry.addToggleMenuItem('fullscreen', {
  1318.         text: 'Fullscreen',
  1319.         icon: 'fullscreen',
  1320.         shortcut: 'Meta+Shift+F',
  1321.         onAction: onAction,
  1322.         onSetup: makeSetupHandler(editor, fullscreenState)
  1323.       });
  1324.       editor.ui.registry.addToggleButton('fullscreen', {
  1325.         tooltip: 'Fullscreen',
  1326.         icon: 'fullscreen',
  1327.         onAction: onAction,
  1328.         onSetup: makeSetupHandler(editor, fullscreenState)
  1329.       });
  1330.     };
  1331.  
  1332.     function Plugin () {
  1333.       global$3.add('fullscreen', function (editor) {
  1334.         var fullscreenState = Cell(null);
  1335.         if (editor.inline) {
  1336.           return get$5(fullscreenState);
  1337.         }
  1338.         register$1(editor, fullscreenState);
  1339.         register(editor, fullscreenState);
  1340.         editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen');
  1341.         return get$5(fullscreenState);
  1342.       });
  1343.     }
  1344.  
  1345.     Plugin();
  1346.  
  1347. }());
  1348.