anchor.diff:  import 'dart:convert';
   import 'dart:html';
   import 'dart:js';
  +import 'dart:math';
   import 'package:crypto/crypto.dart';
   import 'package:utf/utf.dart';
   
  
positive.code:   // Constructor.
    AsciiDocEditor() {
      // Save demo source text.
      final DivElement sourceNode = querySelector('#${_SOURCE_NODE_ID}');
      _demoSourceText = sourceNode.text.trim();
  
      // Initialize editor.
      _aceEditor = context['ace'].callMethod(
          'edit', [_SOURCE_NODE_ID]);
      _aceEditorSession = _aceEditor.callMethod('getSession');
      // _aceEditor.callMethod('setTheme', ['ace/theme/monokai']);
      _aceEditorSession.callMethod(
  
negative.code:   bool allowsUri(String uri) => true;
  }
  
  // A struct holding data used for scroll ratio/position computation for an
  // element.
  class _ScrollSize {
    // Height of the viewport, i.e., the visible portion of the element.
    num viewportHeight;
    // Height of the content in the element, i.e. the scrollHeight.
    num contentHeight;
  
    // The maximum possible scrollTop value for this element.
    num get maxScrollTop => max(0, contentHeight - viewportHeight);
    // Converts a scrollTop value to a scroll position ratio (between 0 and 1).
    num toScrollRatio(num scrollTop) =>
        maxScrollTop > 0 ?
        scrollTop / maxScrollTop :
        1.0;
    // Converts a scroll position ration to a concrete scrollTop value.
    num toScrollTop(num scrollRatio) => scrollRatio * maxScrollTop;
  
    // Constructor.
    _ScrollSize(this.viewportHeight, this.contentHeight);
  }
  
  
  void main() {
    AsciiDocEditor editor = new AsciiDocEditor();
  