Authorea Bot Merge github.com:sr320/paper-Temp-stress  about 9 years ago

Commit id: 6f4fa297396d06eca687e524ef5a720568583ebb

deletions | additions      

       

"cell_type": "markdown",  "metadata": {},  "source": [  "# Intersect bed ongene-centric  features" ]  },  { 

"print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))"  ]  },  {  "cell_type": "markdown",  "metadata": {  "collapsed": true  },  "source": [  "# TE-Blast"  ]  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "\"Screenshot_4_3_15__7_42_AM_1ACEDE69.png\"/"  ]  },  {  "cell_type": "code",  "execution_count": 37,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  " 368 WUBlastX\n",  " 15 WUBlastX\n"  ]  }  ],  "source": [  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \\\n",  "| cut -f 6 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \\\n",  "| cut -f 6 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "code",  "execution_count": 38,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  " 251 WUBlastX\n",  " 3 WUBlastX\n"  ]  }  ],  "source": [  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \\\n",  "| cut -f 6 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \\\n",  "| cut -f 6 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "code",  "execution_count": 39,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  " 141 WUBlastX\n",  " 27 WUBlastX\n"  ]  }  ],  "source": [  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \\\n",  "| cut -f 6 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \\\n",  "| cut -f 6 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "# Promoter"  ]  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "\"Screenshot_4_3_15__7_48_AM_1ACEDFD9.png\"/"  ]  },  {  "cell_type": "code",  "execution_count": 40,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  " 720 flankbed\tpromoter\n",  " 256 flankbed\tpromoter\n"  ]  }  ],  "source": [  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "code",  "execution_count": 41,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  " 684 flankbed\tpromoter\n",  " 308 flankbed\tpromoter\n"  ]  }  ],  "source": [  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "# Chi2 test to compare hypo v hyper?"  ]  },  {  "cell_type": "code",  "execution_count": 43,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  "CHI SQUARE\n",  "The corrected chi2 value is 70.128, with p=0.000\n",  "The uncorrected chi2 value is 70.329, with p=0.000\n"  ]  }  ],  "source": [  "# Enter the data comparing Oyster ALL hypo versus hyper -HOUSEKEEPING\n",  "obs = array([[6527, 21429], [3871, 10434]])\n",  "\n",  "# Calculate the chi-square test\n",  "chi2_corrected = stats.chi2_contingency(obs, correction=True)\n",  "chi2_uncorrected = stats.chi2_contingency(obs, correction=False)\n",  "\n",  "# Print the result\n",  "print('CHI SQUARE')\n",  "print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))\n",  "print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))"  ]  },  {  "cell_type": "code",  "execution_count": 44,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  "CHI SQUARE\n",  "The corrected chi2 value is 2.106, with p=0.147\n",  "The uncorrected chi2 value is 2.174, with p=0.140\n"  ]  }  ],  "source": [  "# Enter the data comparing Oyster ALL hypo versus hyper -DEGS\n",  "obs = array([[1524, 21429], [692, 10434]])\n",  "\n",  "# Calculate the chi-square test\n",  "chi2_corrected = stats.chi2_contingency(obs, correction=True)\n",  "chi2_uncorrected = stats.chi2_contingency(obs, correction=False)\n",  "\n",  "# Print the result\n",  "print('CHI SQUARE')\n",  "print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))\n",  "print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))"  ]  },  {  "cell_type": "code",  "execution_count": 45,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  "CHI SQUARE\n",  "The corrected chi2 value is 264.516, with p=0.000\n",  "The uncorrected chi2 value is 265.761, with p=0.000\n"  ]  }  ],  "source": [  "# Enter the data comparing Oyster ALL hypo versus hyper -TE blast\n",  "obs = array([[760, 21429], [45, 10434]])\n",  "\n",  "# Calculate the chi-square test\n",  "chi2_corrected = stats.chi2_contingency(obs, correction=True)\n",  "chi2_uncorrected = stats.chi2_contingency(obs, correction=False)\n",  "\n",  "# Print the result\n",  "print('CHI SQUARE')\n",  "print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))\n",  "print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))"  ]  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "\"Screenshot_4_3_15__8_07_AM_1ACEE442.png\"/"  ]  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "# Hypo v Hyper on Ensembl gff - gives data on gene body, and repeats"  ]  },  {  "cell_type": "code",  "execution_count": 48,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  "hypo\n",  "1065 GigaDB\tCDS\n",  "1065 GigaDB\texon\n",  "6094 GigaDB\tgene\n",  "6094 GigaDB\ttranscript\n",  " 918 dust\trepeat_region\n",  " 819 trf\trepeat_region\n",  "hyper\n",  " 308 GigaDB\tCDS\n",  " 308 GigaDB\texon\n",  "2374 GigaDB\tgene\n",  "2374 GigaDB\ttranscript\n",  " 322 dust\trepeat_region\n",  " 156 trf\trepeat_region\n"  ]  }  ],  "source": [  "!echo \"hypo\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!echo \"hyper\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "code",  "execution_count": null,  "metadata": {  "collapsed": true  },  "outputs": [],  "source": [  "!echo \"hypo\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!echo \"hyper\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "code",  "execution_count": null,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  "hypo\n",  " 1 EnsemblGenomes\texon\n",  " 1 EnsemblGenomes\tsnRNA\n",  " 1 EnsemblGenomes\tsnRNA_gene\n",  " 568 GigaDB\tCDS\n",  " 568 GigaDB\texon\n",  "6295 GigaDB\tgene\n",  "6295 GigaDB\ttranscript\n",  "1052 dust\trepeat_region\n",  " 550 trf\trepeat_region\n",  "hyper\n"  ]  }  ],  "source": [  "!echo \"hypo\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!echo \"hyper\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "code",  "execution_count": null,           

        Array-feature-overlap-05                                           
    <div id='noscript'>  IPython Notebook requires JavaScript.<br>  Please enable it to proceed.  </div>   
 
                  Array-feature-overlap-05  Last Checkpoint: 6 minutes ago  (autosaved)         
 
   
 
   
   
 
 
 
 
 
 
xxxxxxxxxx
# Intersect bed on features

Intersect bed on features

 
 
Based on notebook 04 - but separating out to see if there is difference between hypo and hyper methylated.

Based on notebook 04 - but separating out to see if there is difference between hypo and hyper methylated.

 
 
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/half-shell___Lab_notebook_of_Steven_Roberts_1ACECD10.png" alt="half-shell___Lab_notebook_of_Steven_Roberts_1ACECD10.png"/>

half-shell___Lab_notebook_of_Steven_Roberts_1ACECD10.png

 
In [2]:
x
 
!date
Fri Apr  3 06:28:54 PDT 2015 
. . .
In [20]:
 
%pylab inline
import scipy.stats as stats
Populating the interactive namespace from numpy and matplotlib 
. . .
 
Feature (from nb -03)    
**tldr** 4 "new" tracks
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/IGV_and_Directory_Listing_of__halfshell_2015-02-hs-bedgraph__1AA51F1B.png" width =100% alt="IGV_and_Directory_Listing_of__halfshell_2015-02-hs-bedgraph__1AA51F1B.png"/>
```
/Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf
/Users/sr320/data-genomic/tentacle/rebuilt.gtf
/Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff
/Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff
```

Feature (from nb -03)

 

tldr 4 "new" tracks  IGV_and_Directory_Listing_of__halfshell_2015-02-hs-bedgraph__1AA51F1B.png

 
/Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf 
/Users/sr320/data-genomic/tentacle/rebuilt.gtf 
/Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff 
/Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff 
 
# DEGs

DEGs

 
 
`-wb    Write the original entry in B for each overlap. Useful for knowing what A overlaps. Restricted by -f and -r.`

-wb Write the original entry in B for each overlap. Useful for knowing what A overlaps. Restricted by -f and -r.

 
xxxxxxxxxx
 
tldr
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__7_22_AM_1ACED994.png" alt="Screenshot_4_3_15__7_22_AM_1ACED994.png"/>

tldr

 

Screenshot_4_3_15__7_22_AM_1ACED994.png

 
 
## Separating HYPO and HYPER

Separating HYPO and HYPER

 
In [1]:
x
!head ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph
track type=bedGraph name="2M_sig" description="2M_sig" visibility=full color=100,100,0 altColor=0,100,200 priority=20 
scaffold1	163391	163444	-1.19635354862016 
scaffold1	167390	167448	-1.34858424227208 
scaffold1	177036	177092	-1.32513261026528 
scaffold1	180263	180313	-1.59644601437398 
scaffold1	184151	184202	-1.36802539236446 
scaffold1	207852	207911	-1.4489540693628 
scaffold1	221645	221697	-1.19168816975966 
scaffold100	20261	20311	-1.38705592724581 
scaffold100	43707	43766	-1.94554287545546 
. . .
In [1]:
x
!fgrep -c "-" ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph
7224 
. . .
In [3]:
x
!fgrep "-" ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph | head
scaffold1	163391	163444	-1.19635354862016 
scaffold1	167390	167448	-1.34858424227208 
scaffold1	177036	177092	-1.32513261026528 
scaffold1	180263	180313	-1.59644601437398 
scaffold1	184151	184202	-1.36802539236446 
scaffold1	207852	207911	-1.4489540693628 
scaffold1	221645	221697	-1.19168816975966 
scaffold100	20261	20311	-1.38705592724581 
scaffold100	43707	43766	-1.94554287545546 
scaffold100	46611	46670	-1.2435587162076 
. . .
In [4]:
x
!fgrep "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph
scaffold1	163391	163444	-1.19635354862016 
scaffold1	167390	167448	-1.34858424227208 
scaffold1	177036	177092	-1.32513261026528 
scaffold1	180263	180313	-1.59644601437398 
scaffold1	184151	184202	-1.36802539236446 
scaffold1	207852	207911	-1.4489540693628 
scaffold1	221645	221697	-1.19168816975966 
scaffold100	20261	20311	-1.38705592724581 
scaffold100	43707	43766	-1.94554287545546 
scaffold100	46611	46670	-1.2435587162076 
. . .
In [6]:
 
!fgrep "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.4M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph
scaffold1	55723	55780	-1.14983078196614 
scaffold1	165162	165215	-1.24601772855566 
scaffold1	171392	171453	-1.22260744814979 
scaffold1	174287	174343	-1.69319890151177 
scaffold1	176273	176334	-1.72785163633438 
scaffold1	183256	183318	-1.30551922539134 
scaffold1	184661	184715	-1.4004518443988 
scaffold1	214736	214786	-1.21921626270337 
scaffold1	215096	215156	-1.24410534350034 
scaffold1	218534	218584	-1.13230161854171 
. . .
In [7]:
 
!fgrep "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.6M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph
scaffold1	54599	54654	-1.38187662416007 
scaffold1	163536	163586	-1.15032035523765 
scaffold1	174287	174343	-1.62903936976887 
scaffold1	184271	184330	-1.20699853451878 
scaffold1	184661	184715	-1.61107459826899 
scaffold1	185141	185192	-1.19168730137504 
scaffold1	210863	210918	-1.74282743323306 
scaffold1	215839	215890	-1.34660189199927 
scaffold1	224010	224070	-1.29699353038817 
scaffold1	227414	227469	-1.17931294986337 
. . .
In [ ]:
 
. . .
In [ ]:
 
. . .
In [ ]:
 
. . .
 
### HYPO

HYPO

 
In [5]:
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c 
 726 Cufflinks 
. . .
In [9]:
x
 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c 
-wb \
 426 Cufflinks 
. . .
In [10]:
x
 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c 
 372 Cufflinks 
. . .
In [10]:
x
!intersectbed \
-wb \
-a /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/array-design/OID40453_probe_locations.gff \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 11 \
| sort | uniq -c 
117460 Cufflinks 
. . .
In [21]:
x
# Enter the data comparing Oyster 2 then Probes
obs = array([[726, 7224], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 177.835, with p=0.000 
The uncorrected chi2 value is 178.264, with p=0.000 
. . .
In [22]:
x
 
# Enter the data comparing Oyster 4 then Probes
obs = array([[426, 6560], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 388.828, with p=0.000 
The uncorrected chi2 value is 389.505, with p=0.000 
. . .
In [23]:
x
 
# Enter the data comparing Oyster 6 then Probes
obs = array([[372, 7645], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 616.865, with p=0.000 
The uncorrected chi2 value is 617.661, with p=0.000 
. . .
 
## HYPER

HYPER

 
In [13]:
x
!fgrep -v "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph
!wc -l /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph
track type=bedGraph name="2M_sig" description="2M_sig" visibility=full color=100,100,0 altColor=0,100,200 priority=20 
scaffold100	250533	250586	1.72713841645018 
scaffold100	362779	362836	1.24792813025432 
scaffold100	437627	437684	1.26968497656438 
scaffold100	439363	439415	1.8535900440036 
scaffold100	458442	458498	1.33779652899652 
scaffold100	636974	637034	1.47573175617257 
scaffold100	637084	637143	1.24656795811596 
scaffold100	642110	642170	1.32784939242625 
scaffold100	676066	676117	2.0744756115782 
    2804 /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph 
. . .
In [12]:
 
!fgrep -v "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.4M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph
!wc -l /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph
track type=bedGraph name="4M_sig" description="4M_sig" visibility=full color=100,100,0 altColor=0,100,200 priority=20 
scaffold1	162896	162952	1.31051906307266 
scaffold1	174020	174073	1.13065801555915 
scaffold1	178210	178267	1.2199265031441 
scaffold1	208737	208792	1.31462945133609 
scaffold100	91713	91767	1.16773934117713 
scaffold100	250282	250335	1.35652322667099 
scaffold100	300103	300158	1.23146709929105 
scaffold100	303374	303434	1.44751323196346 
scaffold100	306375	306430	1.14267878234681 
    3588 /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph 
. . .
In [14]:
 
!fgrep -v "-" \
./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.6M_sig.bedGraph \
> /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph
!head /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph
!wc -l /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph
track type=bedGraph name="6M_sig" description="6M_sig" visibility=full color=100,100,0 altColor=0,100,200 priority=20 
scaffold1	162129	162191	1.85685479189849 
scaffold1	172654	172714	1.33561271440876 
scaffold1	178075	178128	1.42323539316231 
scaffold1	178685	178740	1.30886296151914 
scaffold1	214231	214288	1.23355990867606 
scaffold1	219034	219092	1.34001786676384 
scaffold1	223041	223094	1.32669837521425 
scaffold1	230131	230189	1.41307400393928 
scaffold100	244541	244592	2.500239239607 
    4045 /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph 
. . .
In [15]:
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c 
 154 Cufflinks 
. . .
In [16]:
 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c 
 278 Cufflinks 
. . .
In [17]:
 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 6 \
| sort | uniq -c 
 260 Cufflinks 
. . .
In [18]:
 
!intersectbed \
-wb \
-a /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/array-design/OID40453_probe_locations.gff \
-b /Users/sr320/data-genomic/tentacle/Cuffdiff_geneexp.sig.gtf \
| cut -f 11 \
| sort | uniq -c 
117460 Cufflinks 
. . .
In [24]:
x
 
# Enter the data comparing Oyster 2 then Probes
obs = array([[154, 2803], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 201.876, with p=0.000 
The uncorrected chi2 value is 202.623, with p=0.000 
. . .
In [25]:
x
 
# Enter the data comparing Oyster 2 then Probes
obs = array([[278, 3587], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 162.143, with p=0.000 
The uncorrected chi2 value is 162.728, with p=0.000 
. . .
In [26]:
x
 
# Enter the data comparing Oyster 2 then Probes
obs = array([[260, 4044], [117460, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 243.013, with p=0.000 
The uncorrected chi2 value is 243.693, with p=0.000 
. . .
In [ ]:
 
. . .
In [ ]:
 
. . .
In [ ]:
 
. . .
 
# Rebuilt (new gtf based on RNAseq data)

Rebuilt (new gtf based on RNAseq data)

 
In [15]:
 
!intersectbed \
-wb \
-a ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph \
-b /Users/sr320/data-genomic/tentacle/rebuilt.gtf \
| cut -f 6 \
| sort | uniq -c 
8768 Cufflinks 
. . .
In [16]:
 
!intersectbed \
-wb \
-a ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.4M_sig.bedGraph \
-b /Users/sr320/data-genomic/tentacle/rebuilt.gtf \
| cut -f 6 \
| sort | uniq -c 
7694 Cufflinks 
. . .
In [17]:
 
!intersectbed \
-wb \
-a ./data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.6M_sig.bedGraph \
-b /Users/sr320/data-genomic/tentacle/rebuilt.gtf \
| cut -f 6 \
| sort | uniq -c 
6160 Cufflinks 
. . .
In [18]:
 
!intersectbed \
-wb \
-a /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/array-design/OID40453_probe_locations.gff \
-b /Users/sr320/data-genomic/tentacle/rebuilt.gtf \
| cut -f 11 \
| sort | uniq -c 
1197818 Cufflinks 
. . .
In [39]:
x
# Enter the data comparing Oyster 2 then Probes
obs = array([[8768, 10028], [1197818, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
chi2_corrected = stats.chi2_contingency(obs, correction=True)
CHI SQUARE 
The corrected chi2 value is 2184.818, with p=0.000 
The uncorrected chi2 value is 2185.528, with p=0.000 
. . .
In [40]:
 
# Enter the data comparing Oyster 4 then Probes
obs = array([[7694, 10148], [1197818, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 3052.863, with p=0.000 
The uncorrected chi2 value is 3053.724, with p=0.000 
. . .
In [41]:
 
# Enter the data comparing Oyster 6 then Probes
obs = array([[6160, 11690], [1197818, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 6233.645, with p=0.000 
The uncorrected chi2 value is 6234.874, with p=0.000 
. . .
 
# Housekeeping Genes

Housekeeping Genes

 
 
Separating out hypo and hyper

Separating out hypo and hyper

 
 
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__7_23_AM_1ACED9DD.png" alt="Screenshot_4_3_15__7_23_AM_1ACED9DD.png"/>

Screenshot_4_3_15__7_23_AM_1ACED9DD.png

 
In [29]:
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c 
2172 GLEAN 
1038 GLEAN 
. . .
In [30]:
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c 
1988 GLEAN 
1381 GLEAN 
. . .
In [31]:
x
 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 6 \
| sort | uniq -c 
2367 GLEAN 
1452 GLEAN 
. . .
In [26]:
 
!intersectbed \
-wb \
-a /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/array-design/OID40453_probe_locations.gff \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-housekeeping.gff \
| cut -f 11 \
| sort | uniq -c 
251970 GLEAN 
. . .
In [42]:
 
# Enter the data comparing Oyster 2 then Probes
obs = array([[3210, 10028], [251970, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 34.806, with p=0.000 
The uncorrected chi2 value is 34.923, with p=0.000 
. . .
In [43]:
 
# Enter the data comparing Oyster 4 then Probes
obs = array([[3369, 10148], [251970, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 17.578, with p=0.000 
The uncorrected chi2 value is 17.661, with p=0.000 
. . .
In [47]:
 
# Enter the data comparing Oyster 6 then Probes
obs = array([[3819, 11690], [251970, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 28.378, with p=0.000 
The uncorrected chi2 value is 28.476, with p=0.000 
. . .
In [ ]:
 
. . .
In [ ]:
 
. . .
 
# Environmental Response Genes

Environmental Response Genes

 
 
separating Hypo and Hyper

separating Hypo and Hyper

 
 
tldr
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__7_28_AM_1ACEDB27.png" alt="Screenshot_4_3_15__7_28_AM_1ACEDB27.png"/>

tldr  Screenshot_4_3_15__7_28_AM_1ACEDB27.png

 
In [ ]:
 
. . .
In [33]:
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c 
2063 GLEAN 
 746 GLEAN 
. . .
In [34]:
x
 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c 
1873 GLEAN 
 865 GLEAN 
. . .
In [35]:
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 6 \
| sort | uniq -c 
2175 GLEAN 
1041 GLEAN 
. . .
In [27]:
 
!intersectbed \
-wb \
-a /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/array-design/OID40453_probe_locations.gff \
-b /Users/sr320/data-genomic/tentacle/Cgigas_v9_gene-env-response.gff \
| cut -f 11 \
| sort | uniq -c 
190475 GLEAN 
. . .
In [45]:
 
# Enter the data comparing Oyster 2 then Probes
obs = array([[2809, 10028], [190475, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 1.413, with p=0.235 
The uncorrected chi2 value is 1.439, with p=0.230 
. . .
In [48]:
 
# Enter the data comparing Oyster 4 then Probes
obs = array([[2738, 10148], [190475, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 0.280, with p=0.597 
The uncorrected chi2 value is 0.291, with p=0.589 
. . .
In [49]:
 
# Enter the data comparing Oyster 6 then Probes
obs = array([[3216, 11690], [190475, 697753]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 0.141, with p=0.707 
The uncorrected chi2 value is 0.149, with p=0.700 
. . .
 
# TE-Blast

TE-Blast

 
 
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__7_42_AM_1ACEDE69.png" alt="Screenshot_4_3_15__7_42_AM_1ACEDE69.png"/>

Screenshot_4_3_15__7_42_AM_1ACEDE69.png

 
In [37]:
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
 368 WUBlastX 
  15 WUBlastX 
. . .
In [38]:
 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
 251 WUBlastX 
   3 WUBlastX 
. . .
In [39]:
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_TE-WUBLASTX.gff \
| cut -f 6 \
| sort | uniq -c | sed '/#/d'
 141 WUBlastX 
  27 WUBlastX 
. . .
 
# Promoter

Promoter

 
 
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__7_48_AM_1ACEDFD9.png" alt="Screenshot_4_3_15__7_48_AM_1ACEDFD9.png"/>

Screenshot_4_3_15__7_48_AM_1ACEDFD9.png

 
In [40]:
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
 720 flankbed	promoter 
 256 flankbed	promoter 
. . .
In [41]:
x
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
 684 flankbed	promoter 
 308 flankbed	promoter 
. . .
 
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'

!intersectbed \  -wb \  -a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \  -b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \  | cut -f 6,7 \  | sort | uniq -c | sed '/#/d'  !intersectbed \  -wb \  -a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \  -b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \  | cut -f 6,7 \  | sort | uniq -c | sed '/#/d'

 
 
# Chi2 test to compare hypo v hyper?

Chi2 test to compare hypo v hyper?

 
In [43]:
x
# Enter the data comparing Oyster ALL hypo versus hyper -HOUSEKEEPING
obs = array([[6527, 21429], [3871, 10434]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 70.128, with p=0.000 
The uncorrected chi2 value is 70.329, with p=0.000 
. . .
In [44]:
x
# Enter the data comparing Oyster ALL hypo versus hyper -DEGS
obs = array([[1524, 21429], [692, 10434]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 2.106, with p=0.147 
The uncorrected chi2 value is 2.174, with p=0.140 
. . .
In [45]:
x
 
# Enter the data comparing Oyster ALL hypo versus hyper -TE blast
obs = array([[760, 21429], [45, 10434]])
# Calculate the chi-square test
chi2_corrected = stats.chi2_contingency(obs, correction=True)
chi2_uncorrected = stats.chi2_contingency(obs, correction=False)
# Print the result
print('CHI SQUARE')
print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))
print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))
CHI SQUARE 
The corrected chi2 value is 264.516, with p=0.000 
The uncorrected chi2 value is 265.761, with p=0.000 
. . .
 
<img src="http://eagle.fish.washington.edu/cnidarian/skitch/Screenshot_4_3_15__8_07_AM_1ACEE442.png" alt="Screenshot_4_3_15__8_07_AM_1ACEE442.png"/>

Screenshot_4_3_15__8_07_AM_1ACEE442.png

 
 
# Hypo v Hyper on Ensembl gff - gives data on gene body, and repeats

Hypo v Hyper on Ensembl gff - gives data on gene body, and repeats

 
In [48]:
x
!echo "hypo"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!echo "hyper"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
hypo 
1065 GigaDB	CDS 
1065 GigaDB	exon 
6094 GigaDB	gene 
6094 GigaDB	transcript 
 918 dust	repeat_region 
 819 trf	repeat_region 
hyper 
 308 GigaDB	CDS 
 308 GigaDB	exon 
2374 GigaDB	gene 
2374 GigaDB	transcript 
 322 dust	repeat_region 
 156 trf	repeat_region 
. . .
In [50]:
 
!echo "hypo"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!echo "hyper"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
hypo 
   1 EnsemblGenomes	exon 
   1 EnsemblGenomes	pseudogenic_tRNA 
   1 EnsemblGenomes	transcript 
 715 GigaDB	CDS 
 715 GigaDB	exon 
5389 GigaDB	gene 
5389 GigaDB	transcript 
 907 dust	repeat_region 
 653 trf	repeat_region 
hyper 
   1 EnsemblGenomes	exon 
   1 EnsemblGenomes	tRNA_gene 
   1 EnsemblGenomes	transcript 
 462 GigaDB	CDS 
 462 GigaDB	exon 
3102 GigaDB	gene 
3102 GigaDB	transcript 
 413 dust	repeat_region 
 220 trf	repeat_region 
. . .
In [49]:
 
!echo "hypo"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
!echo "hyper"
!intersectbed \
-wb \
-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \
-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \
| cut -f 6,7 \
| sort | uniq -c | sed '/#/d'
hypo 
   1 EnsemblGenomes	exon 
   1 EnsemblGenomes	snRNA 
   1 EnsemblGenomes	snRNA_gene 
 568 GigaDB	CDS 
 568 GigaDB	exon 
6295 GigaDB	gene 
6295 GigaDB	transcript 
1052 dust	repeat_region 
 550 trf	repeat_region 
hyper 
 379 GigaDB	CDS 
 380 GigaDB	exon 
3394 GigaDB	gene 
3394 GigaDB	transcript 
 539 dust	repeat_region 
 314 trf	repeat_region 
. . .
In [ ]:
 
. . .
   
 
 
 
 
 
 
 
 
       
         

"| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "# Chi2 test to compare hypo v hyper?"  ]  },  {  "cell_type": "code",  "execution_count": 42, 43,  "metadata": {  "collapsed": false  }, 

"name": "stdout",  "output_type": "stream",  "text": [  " 856 flankbed\tpromoter\n",  " 392 flankbed\tpromoter\n" "CHI SQUARE\n",  "The corrected chi2 value is 70.128, with p=0.000\n",  "The uncorrected chi2 value is 70.329, with p=0.000\n"  ]  }  ],  "source": [  "# Enter the data comparing Oyster ALL hypo versus hyper -HOUSEKEEPING\n",  "obs = array([[6527, 21429], [3871, 10434]])\n",  "\n",  "# Calculate the chi-square test\n",  "chi2_corrected = stats.chi2_contingency(obs, correction=True)\n",  "chi2_uncorrected = stats.chi2_contingency(obs, correction=False)\n",  "\n",  "# Print the result\n",  "print('CHI SQUARE')\n",  "print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))\n",  "print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))"  ]  },  {  "cell_type": "code",  "execution_count": 44,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  "CHI SQUARE\n",  "The corrected chi2 value is 2.106, with p=0.147\n",  "The uncorrected chi2 value is 2.174, with p=0.140\n"  ]  }  ],  "source": [  "# Enter the data comparing Oyster ALL hypo versus hyper -DEGS\n",  "obs = array([[1524, 21429], [692, 10434]])\n",  "\n",  "# Calculate the chi-square test\n",  "chi2_corrected = stats.chi2_contingency(obs, correction=True)\n",  "chi2_uncorrected = stats.chi2_contingency(obs, correction=False)\n",  "\n",  "# Print the result\n",  "print('CHI SQUARE')\n",  "print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))\n",  "print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))"  ]  },  {  "cell_type": "code",  "execution_count": 45,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  "CHI SQUARE\n",  "The corrected chi2 value is 264.516, with p=0.000\n",  "The uncorrected chi2 value is 265.761, with p=0.000\n"  ]  }  ],  "source": [  "# Enter the data comparing Oyster ALL hypo versus hyper -TE blast\n",  "obs = array([[760, 21429], [45, 10434]])\n",  "\n",  "# Calculate the chi-square test\n",  "chi2_corrected = stats.chi2_contingency(obs, correction=True)\n",  "chi2_uncorrected = stats.chi2_contingency(obs, correction=False)\n",  "\n",  "# Print the result\n",  "print('CHI SQUARE')\n",  "print('The corrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_corrected[0], chi2_corrected[1]))\n",  "print('The uncorrected chi2 value is {0:5.3f}, with p={1:5.3f}'.format(chi2_uncorrected[0], chi2_uncorrected[1]))"  ]  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "\"Screenshot_4_3_15__8_07_AM_1ACEE442.png\"/"  ]  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "# Hypo v Hyper on Ensembl gff - gives data on gene body, and repeats"  ]  },  {  "cell_type": "code",  "execution_count": 48,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  "hypo\n",  "1065 GigaDB\tCDS\n",  "1065 GigaDB\texon\n",  "6094 GigaDB\tgene\n",  "6094 GigaDB\ttranscript\n",  " 918 dust\trepeat_region\n",  " 819 trf\trepeat_region\n",  "hyper\n",  " 308 GigaDB\tCDS\n",  " 308 GigaDB\texon\n",  "2374 GigaDB\tgene\n",  "2374 GigaDB\ttranscript\n",  " 322 dust\trepeat_region\n",  " 156 trf\trepeat_region\n"  ]  }  ],  "source": [  "!echo \"hypo\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!echo \"hyper\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.2M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "code",  "execution_count": 50,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  "hypo\n",  " 1 EnsemblGenomes\texon\n",  " 1 EnsemblGenomes\tpseudogenic_tRNA\n",  " 1 EnsemblGenomes\ttranscript\n",  " 715 GigaDB\tCDS\n",  " 715 GigaDB\texon\n",  "5389 GigaDB\tgene\n",  "5389 GigaDB\ttranscript\n",  " 907 dust\trepeat_region\n",  " 653 trf\trepeat_region\n",  "hyper\n",  " 1 EnsemblGenomes\texon\n",  " 1 EnsemblGenomes\ttRNA_gene\n",  " 1 EnsemblGenomes\ttranscript\n",  " 462 GigaDB\tCDS\n",  " 462 GigaDB\texon\n",  "3102 GigaDB\tgene\n",  "3102 GigaDB\ttranscript\n",  " 413 dust\trepeat_region\n",  " 220 trf\trepeat_region\n"  ]  }  ],  "source": [  "!echo \"hypo\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!echo \"hyper\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.4M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \\\n",  "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "code",  "execution_count": 49,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  "hypo\n",  " 1 EnsemblGenomes\texon\n",  " 1 EnsemblGenomes\tsnRNA\n",  " 1 EnsemblGenomes\tsnRNA_gene\n",  " 568 GigaDB\tCDS\n",  " 568 GigaDB\texon\n",  "6295 GigaDB\tgene\n",  "6295 GigaDB\ttranscript\n",  "1052 dust\trepeat_region\n",  " 550 trf\trepeat_region\n",  "hyper\n",  " 379 GigaDB\tCDS\n",  " 380 GigaDB\texon\n",  "3394 GigaDB\tgene\n",  "3394 GigaDB\ttranscript\n",  " 539 dust\trepeat_region\n",  " 314 trf\trepeat_region\n"  ]  }  ],  "source": [  "!echo \"hypo\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hypo.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3  \\\n", "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'\n",  "!echo \"hyper\"\n",  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/data-genomic/tentacle/2014.07.02.6M_sig.hyper.bedGraph \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_v9_tracks/Cgigas_v9_1k5p_gene_promoter.gff /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3  \\\n", "| cut -f 6,7 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "code",  "execution_count": 51,  "metadata": {  "collapsed": false  },  "outputs": [  {  "name": "stdout",  "output_type": "stream",  "text": [  " 5 EnsemblGenomes\tRNA\r\n",  " 444 EnsemblGenomes\texon\r\n",  " 6 EnsemblGenomes\tgene\r\n",  " 2 EnsemblGenomes\tmiRNA\r\n",  " 2 EnsemblGenomes\tmiRNA_gene\r\n",  " 259 EnsemblGenomes\tpseudogenic_tRNA\r\n",  " 14 EnsemblGenomes\tsnRNA\r\n",  " 14 EnsemblGenomes\tsnRNA_gene\r\n",  " 6 EnsemblGenomes\tsnoRNA\r\n",  " 6 EnsemblGenomes\tsnoRNA_gene\r\n",  " 152 EnsemblGenomes\ttRNA_gene\r\n",  " 422 EnsemblGenomes\ttranscript\r\n",  "157279 GigaDB\tCDS\r\n",  "157307 GigaDB\texon\r\n",  "600445 GigaDB\tgene\r\n",  "600445 GigaDB\ttranscript\r\n",  "56210 dust\trepeat_region\r\n",  "42390 trf\trepeat_region\r\n"  ]  }  ],  "source": [  "!intersectbed \\\n",  "-wb \\\n",  "-a /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/array-design/OID40453_probe_locations.gff \\\n",  "-b /Volumes/web-1/trilobite/Crassostrea_gigas_ensembl_tracks/Crassostrea_gigas.GCA_000297895.1.25.sorted.gff3 \\\n",  "| cut -f 11,12 \\\n",  "| sort | uniq -c | sed '/#/d'"  ]  },  {  "cell_type": "code",  "execution_count": null,        Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/IGV_and_Directory_Listing_of__halfshell_2015-02-hs-bedgraph__1AA51F1B.png differ          

/*  * /MathJax.js  *  * Copyright (c) 2009-2015 The MathJax Consortium  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  * http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */  if(document.getElementById&&document.childNodes&&document.createElement){if(!(window.MathJax&&MathJax.Hub)){if(window.MathJax){window.MathJax={AuthorConfig:window.MathJax}}else{window.MathJax={}}MathJax.isPacked=true;MathJax.version="2.5.1";MathJax.fileversion="2.5.1";MathJax.cdnVersion="2.5.1";MathJax.cdnFileVersions={};(function(d){var b=window[d];if(!b){b=window[d]={}}var e=[];var c=function(f){var g=f.constructor;if(!g){g=function(){}}for(var h in f){if(h!=="constructor"&&f.hasOwnProperty(h)){g[h]=f[h]}}return g};var a=function(){return function(){return arguments.callee.Init.call(this,arguments)}};b.Object=c({constructor:a(),Subclass:function(f,h){var g=a();g.SUPER=this;g.Init=this.Init;g.Subclass=this.Subclass;g.Augment=this.Augment;g.protoFunction=this.protoFunction;g.can=this.can;g.has=this.has;g.isa=this.isa;g.prototype=new this(e);g.prototype.constructor=g;g.Augment(f,h);return g},Init:function(f){var g=this;if(f.length===1&&f[0]===e){return g}if(!(g instanceof f.callee)){g=new f.callee(e)}return g.Init.apply(g,f)||g},Augment:function(f,g){var h;if(f!=null){for(h in f){if(f.hasOwnProperty(h)){this.protoFunction(h,f[h])}}if(f.toString!==this.prototype.toString&&f.toString!=={}.toString){this.protoFunction("toString",f.toString)}}if(g!=null){for(h in g){if(g.hasOwnProperty(h)){this[h]=g[h]}}}return this},protoFunction:function(g,f){this.prototype[g]=f;if(typeof f==="function"){f.SUPER=this.SUPER.prototype}},prototype:{Init:function(){},SUPER:function(f){return f.callee.SUPER},can:function(f){return typeof(this[f])==="function"},has:function(f){return typeof(this[f])!=="undefined"},isa:function(f){return(f instanceof Object)&&(this instanceof f)}},can:function(f){return this.prototype.can.call(this,f)},has:function(f){return this.prototype.has.call(this,f)},isa:function(g){var f=this;while(f){if(f===g){return true}else{f=f.SUPER}}return false},SimpleSUPER:c({constructor:function(f){return this.SimpleSUPER.define(f)},define:function(f){var h={};if(f!=null){for(var g in f){if(f.hasOwnProperty(g)){h[g]=this.wrap(g,f[g])}}if(f.toString!==this.prototype.toString&&f.toString!=={}.toString){h.toString=this.wrap("toString",f.toString)}}return h},wrap:function(i,h){if(typeof(h)!=="function"||!h.toString().match(/\.\s*SUPER\s*\(/)){return h}var g=function(){this.SUPER=g.SUPER[i];try{var f=h.apply(this,arguments)}catch(j){delete this.SUPER;throw j}delete this.SUPER;return f};g.toString=function(){return h.toString.apply(h,arguments)};return g}})})})("MathJax");(function(BASENAME){var BASE=window[BASENAME];if(!BASE){BASE=window[BASENAME]={}}var CALLBACK=function(data){var cb=function(){return arguments.callee.execute.apply(arguments.callee,arguments)};for(var id in CALLBACK.prototype){if(CALLBACK.prototype.hasOwnProperty(id)){if(typeof(data[id])!=="undefined"){cb[id]=data[id]}else{cb[id]=CALLBACK.prototype[id]}}}cb.toString=CALLBACK.prototype.toString;return cb};CALLBACK.prototype={isCallback:true,hook:function(){},data:[],object:window,execute:function(){if(!this.called||this.autoReset){this.called=!this.autoReset;return this.hook.apply(this.object,this.data.concat([].slice.call(arguments,0)))}},reset:function(){delete this.called},toString:function(){return this.hook.toString.apply(this.hook,arguments)}};var ISCALLBACK=function(f){return(typeof(f)==="function"&&f.isCallback)};var EVAL=function(code){return eval.call(window,code)};var TESTEVAL=function(){EVAL("var __TeSt_VaR__ = 1");if(window.__TeSt_VaR__){try{delete window.__TeSt_VaR__}catch(error){window.__TeSt_VaR__=null}}else{if(window.execScript){EVAL=function(code){BASE.__code=code;code="try {"+BASENAME+".__result = eval("+BASENAME+".__code)} catch(err) {"+BASENAME+".__result = err}";window.execScript(code);var result=BASE.__result;delete BASE.__result;delete BASE.__code;if(result instanceof Error){throw result}return result}}else{EVAL=function(code){BASE.__code=code;code="try {"+BASENAME+".__result = eval("+BASENAME+".__code)} catch(err) {"+BASENAME+".__result = err}";var head=(document.getElementsByTagName("head"))[0];if(!head){head=document.body}var script=document.createElement("script");script.appendChild(document.createTextNode(code));head.appendChild(script);head.removeChild(script);var result=BASE.__result;delete BASE.__result;delete BASE.__code;if(result instanceof Error){throw result}return result}}}TESTEVAL=null};var USING=function(args,i){if(arguments.length>1){if(arguments.length===2&&!(typeof arguments[0]==="function")&&arguments[0] instanceof Object&&typeof arguments[1]==="number"){args=[].slice.call(args,i)}else{args=[].slice.call(arguments,0)}}if(args instanceof Array&&args.length===1){args=args[0]}if(typeof args==="function"){if(args.execute===CALLBACK.prototype.execute){return args}return CALLBACK({hook:args})}else{if(args instanceof Array){if(typeof(args[0])==="string"&&args[1] instanceof Object&&typeof args[1][args[0]]==="function"){return CALLBACK({hook:args[1][args[0]],object:args[1],data:args.slice(2)})}else{if(typeof args[0]==="function"){return CALLBACK({hook:args[0],data:args.slice(1)})}else{if(typeof args[1]==="function"){return CALLBACK({hook:args[1],object:args[0],data:args.slice(2)})}}}}else{if(typeof(args)==="string"){if(TESTEVAL){TESTEVAL()}return CALLBACK({hook:EVAL,data:[args]})}else{if(args instanceof Object){return CALLBACK(args)}else{if(typeof(args)==="undefined"){return CALLBACK({})}}}}}throw Error("Can't make callback from given data")};var DELAY=function(time,callback){callback=USING(callback);callback.timeout=setTimeout(callback,time);return callback};var WAITFOR=function(callback,signal){callback=USING(callback);if(!callback.called){WAITSIGNAL(callback,signal);signal.pending++}};var WAITEXECUTE=function(){var signals=this.signal;delete this.signal;this.execute=this.oldExecute;delete this.oldExecute;var result=this.execute.apply(this,arguments);if(ISCALLBACK(result)&&!result.called){WAITSIGNAL(result,signals)}else{for(var i=0,m=signals.length;i0&&priority=0;i--){this.hooks.splice(i,1)}this.remove=[]}});var EXECUTEHOOKS=function(hooks,data,reset){if(!hooks){return null}if(!(hooks instanceof Array)){hooks=[hooks]}if(!(data instanceof Array)){data=(data==null?[]:[data])}var handler=HOOKS(reset);for(var i=0,m=hooks.length;ig){g=document.styleSheets.length}if(!i){i=document.head||((document.getElementsByTagName("head"))[0]);if(!i){i=document.body}}return i};var f=[];var c=function(){for(var k=0,j=f.length;k=this.timeout){i(this.STATUS.ERROR);return 1}return 0},file:function(j,i){if(i<0){a.Ajax.loadTimeout(j)}else{a.Ajax.loadComplete(j)}},execute:function(){this.hook.call(this.object,this,this.data[0],this.data[1])},checkSafari2:function(i,j,k){if(i.time(k)){return}if(document.styleSheets.length>j&&document.styleSheets[j].cssRules&&document.styleSheets[j].cssRules.length){k(i.STATUS.OK)}else{setTimeout(i,i.delay)}},checkLength:function(i,l,n){if(i.time(n)){return}var m=0;var j=(l.sheet||l.styleSheet);try{if((j.cssRules||j.rules||[]).length>0){m=1}}catch(k){if(k.message.match(/protected variable|restricted URI/)){m=1}else{if(k.message.match(/Security error/)){m=1}}}if(m){setTimeout(a.Callback([n,i.STATUS.OK]),0)}else{setTimeout(i,i.delay)}}},loadComplete:function(i){i=this.fileURL(i);var j=this.loading[i];if(j&&!j.preloaded){a.Message.Clear(j.message);clearTimeout(j.timeout);if(j.script){if(f.length===0){setTimeout(c,0)}f.push(j.script)}this.loaded[i]=j.status;delete this.loading[i];this.addHook(i,j.callback)}else{if(j){delete this.loading[i]}this.loaded[i]=this.STATUS.OK;j={status:this.STATUS.OK}}if(!this.loadHooks[i]){return null}return this.loadHooks[i].Execute(j.status)},loadTimeout:function(i){if(this.loading[i].timeout){clearTimeout(this.loading[i].timeout)}this.loading[i].status=this.STATUS.ERROR;this.loadError(i);this.loadComplete(i)},loadError:function(i){a.Message.Set(["LoadFailed","File failed to load: %1",i],null,2000);a.Hub.signal.Post(["file load error",i])},Styles:function(k,l){var i=this.StyleString(k);if(i===""){l=a.Callback(l);l()}else{var j=document.createElement("style");j.type="text/css";this.head=h(this.head);this.head.appendChild(j);if(j.styleSheet&&typeof(j.styleSheet.cssText)!=="undefined"){j.styleSheet.cssText=i}else{j.appendChild(document.createTextNode(i))}l=this.timer.create.call(this,l,j)}return l},StyleString:function(n){if(typeof(n)==="string"){return n}var k="",o,m;for(o in n){if(n.hasOwnProperty(o)){if(typeof n[o]==="string"){k+=o+" {"+n[o]+"}\n"}else{if(n[o] instanceof Array){for(var l=0;l="0"&&p<="9"){f[j]=o[f[j]-1];if(typeof f[j]==="number"){f[j]=this.number(f[j])}}else{if(p==="{"){p=f[j].substr(1);if(p>="0"&&p<="9"){f[j]=o[f[j].substr(1,f[j].length-2)-1];if(typeof f[j]==="number"){f[j]=this.number(f[j])}}else{var k=f[j].match(/^\{([a-z]+):%(\d+)\|(.*)\}$/);if(k){if(k[1]==="plural"){var d=o[k[2]-1];if(typeof d==="undefined"){f[j]="???"}else{d=this.plural(d)-1;var h=k[3].replace(/(^|[^%])(%%)*%\|/g,"$1$2%\uEFEF").split(/\|/);if(d>=0&&d=3){c.push([f[0],f[1],this.processSnippet(g,f[2])])}else{c.push(e[d])}}}}else{c.push(e[d])}}return c},markdownPattern:/(%.)|(\*{1,3})((?:%.|.)+?)\2|(`+)((?:%.|.)+?)\4|\[((?:%.|.)+?)\]\(([^\s\)]+)\)/,processMarkdown:function(b,h,d){var j=[],e;var c=b.split(this.markdownPattern);var g=c[0];for(var f=1,a=c.length;f1?d[1]:""));f=null}if(e&&(!b.preJax||d)){c.nodeValue=c.nodeValue.replace(b.postJax,(e.length>1?e[1]:""))}if(f&&!f.nodeValue.match(/\S/)){f=f.previousSibling}}if(b.preRemoveClass&&f&&f.className===b.preRemoveClass){a.MathJax.preview=f}a.MathJax.checked=1},processInput:function(a){var b,i=MathJax.ElementJax.STATE;var h,e,d=a.scripts.length;try{while(a.ithis.processUpdateTime&&a.i1){d.jax[a.outputJax].push(b)}b.MathJax.state=c.OUTPUT},prepareOutput:function(c,f){while(c.jthis.processUpdateTime&&h.i=0;p--){if((b[p].src||"").match(e)){r.script=b[p].innerHTML;if(RegExp.$2){var s=RegExp.$2.substr(1).split(/\&/);for(var o=0,k=s.length;o=parseInt(x[y])}}return true},Select:function(j){var i=j[c.Browser];if(i){return i(c.Browser)}return null}};var d=h.replace(/^Mozilla\/(\d+\.)+\d+ /,"").replace(/[a-z][-a-z0-9._: ]+\/\d+[^ ]*-[^ ]*\.([a-z][a-z])?\d+ /i,"").replace(/Gentoo |Ubuntu\/(\d+\.)*\d+ (\([^)]*\) )?/,"");c.Browser=c.Insert(c.Insert(new String("Unknown"),{version:"0.0"}),a);for(var u in a){if(a.hasOwnProperty(u)){if(a[u]&&u.substr(0,2)==="is"){u=u.slice(2);if(u==="Mac"||u==="PC"){continue}c.Browser=c.Insert(new String(u),a);var q=new RegExp(".*(Version/| Trident/.*; rv:)((?:\\d+\\.)+\\d+)|.*("+u+")"+(u=="MSIE"?" ":"/")+"((?:\\d+\\.)*\\d+)|(?:^|\\(| )([a-z][-a-z0-9._: ]+|(?:Apple)?WebKit)/((?:\\d+\\.)+\\d+)");var t=q.exec(d)||["","","","unknown","0.0"];c.Browser.name=(t[1]!=""?u:(t[3]||t[5]));c.Browser.version=t[2]||t[4]||t[6];break}}}c.Browser.Select({Safari:function(j){var i=parseInt((String(j.version).split("."))[0]);if(i>85){j.webkit=j.version}if(i>=538){j.version="8.0"}else{if(i>=537){j.version="7.0"}else{if(i>=536){j.version="6.0"}else{if(i>=534){j.version="5.1"}else{if(i>=533){j.version="5.0"}else{if(i>=526){j.version="4.0"}else{if(i>=525){j.version="3.1"}else{if(i>500){j.version="3.0"}else{if(i>400){j.version="2.0"}else{if(i>85){j.version="1.0"}}}}}}}}}}j.webkit=(navigator.appVersion.match(/WebKit\/(\d+)\./))[1];j.isMobile=(navigator.appVersion.match(/Mobile/i)!=null);j.noContextMenu=j.isMobile},Firefox:function(j){if((j.version==="0.0"||h.match(/Firefox/)==null)&&navigator.product==="Gecko"){var m=h.match(/[\/ ]rv:(\d+\.\d.*?)[\) ]/);if(m){j.version=m[1]}else{var i=(navigator.buildID||navigator.productSub||"0").substr(0,8);if(i>="20111220"){j.version="9.0"}else{if(i>="20111120"){j.version="8.0"}else{if(i>="20110927"){j.version="7.0"}else{if(i>="20110816"){j.version="6.0"}else{if(i>="20110621"){j.version="5.0"}else{if(i>="20110320"){j.version="4.0"}else{if(i>="20100121"){j.version="3.6"}else{if(i>="20090630"){j.version="3.5"}else{if(i>="20080617"){j.version="3.0"}else{if(i>="20061024"){j.version="2.0"}}}}}}}}}}}}j.isMobile=(navigator.appVersion.match(/Android/i)!=null||h.match(/ Fennec\//)!=null||h.match(/Mobile/)!=null)},Opera:function(i){i.version=opera.version()},MSIE:function(j){j.isIE9=!!(document.documentMode&&(window.performance||window.msPerformance));MathJax.HTML.setScriptBug=!j.isIE9||document.documentMode<9;MathJax.Hub.msieHTMLCollectionBug=(document.documentMode<9);if(document.documentMode<10&&!r.params.NoMathPlayer){try{new ActiveXObject("MathPlayer.Factory.1");j.hasMathPlayer=true}catch(m){}try{if(j.hasMathPlayer){var i=document.createElement("object");i.id="mathplayer";i.classid="clsid:32F66A20-7614-11D4-BD11-00104BD3F987";f.appendChild(i);document.namespaces.add("m","http://www.w3.org/1998/Math/MathML");j.mpNamespace=true;if(document.readyState&&(document.readyState==="loading"||document.readyState==="interactive")){document.write('');j.mpImported=true}}else{document.namespaces.add("mjx_IE_fix","http://www.w3.org/1999/xlink")}}catch(m){}}}});c.Browser.Select(MathJax.Message.browsers);if(g.AuthorConfig&&typeof g.AuthorConfig.AuthorInit==="function"){g.AuthorConfig.AuthorInit()}c.queue=g.Callback.Queue();c.queue.Push(["Post",r.signal,"Begin"],["Config",r],["Cookie",r],["Styles",r],["Message",r],function(){var i=g.Callback.Queue(r.Jax(),r.Extensions());return i.Push({})},["Menu",r],r.onLoad(),function(){MathJax.isReady=true},["Typeset",r],["Hash",r],["MenuZoom",r],["Post",r.signal,"End"])})("MathJax")}};        Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/Screenshot_4_3_15__7_22_AM_1ACED994.png differ       Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/Screenshot_4_3_15__7_23_AM_1ACED9DD.png differ       Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/Screenshot_4_3_15__7_28_AM_1ACEDB27.png differ       Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/Screenshot_4_3_15__7_42_AM_1ACEDE69.png differ       Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/Screenshot_4_3_15__7_48_AM_1ACEDFD9.png differ       Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/Screenshot_4_3_15__8_07_AM_1ACEE442.png differ          

// Copyright (c) IPython Development Team.  // Distributed under the terms of the Modified BSD License.  require([  'jquery',  'base/js/dialog',  'underscore',  'base/js/namespace'  ], function ($, dialog, _, IPython) {  'use strict';  $('#notebook_about').click(function () {  // use underscore template to auto html escape  var text = 'You are using IPython notebook.

';
  text = text + 'The version of the notebook server is ';  text = text + _.template('<%- version %>')({ version: sys_info.ipython_version });  if (sys_info.commit_hash) {  text = text + _.template('-<%- hash %>')({ hash: sys_info.commit_hash });  }  text = text + _.template(' and is running on:
Python <%- pyver %>
')({ pyver: sys_info.sys_version });
  var kinfo = $('
').attr('id', '#about-kinfo').text('Waiting for kernel to be available...');  var body = $('
');  body.append($('

').text('Server Information:'));  body.append($('

').html(text));  body.append($('

').text('Current Kernel Information:'));  body.append(kinfo);  dialog.modal({  title: 'About IPython Notebook',  body: body,  buttons: { 'OK': {} }  });  try {  IPython.notebook.session.kernel.kernel_info(function (data) {  kinfo.html($('
').text(data.content.banner)); 
            }); 
        } catch (e) { 
            kinfo.html($('

').text('unable to contact kernel'));  }  });  });           

// Copyright (c) IPython Development Team.  // Distributed under the terms of the Modified BSD License.  define(function(require){  "use strict";    var ActionHandler = function (env) {  this.env = env || {};  Object.seal(this);  };  /**  * A bunch of predefined `Simple Actions` used by IPython.  * `Simple Actions` have the following keys:  * help (optional): a short string the describe the action.  * will be used in various context, like as menu name, tool tips on buttons,  * and short description in help menu.  * help_index (optional): a string used to sort action in help menu.  * icon (optional): a short string that represent the icon that have to be used with this  * action. this should mainly correspond to a Font_awesome class.  * handler : a function which is called when the action is activated. It will receive at first parameter  * a dictionary containing various handle to element of the notebook.  *  * action need to be registered with a **name** that can be use to refer to this action.  *  *  * if `help` is not provided it will be derived by replacing any dash by space  * in the **name** of the action. It is advised to provide a prefix to action name to  * avoid conflict the prefix should be all lowercase and end with a dot `.`  * in the absence of a prefix the behavior of the action is undefined.  *  * All action provided by IPython are prefixed with `ipython.`.  *  * One can register extra actions or replace an existing action with another one is possible  * but is considered undefined behavior.  *  **/  var _actions = {  'run-select-next': {  icon: 'fa-play',  help : 'run cell, select below',  help_index : 'ba',  handler : function (env) {  env.notebook.execute_cell_and_select_below();  }  },  'execute-in-place':{  help : 'run cell',  help_index : 'bb',  handler : function (env) {  env.notebook.execute_cell();  }  },  'execute-and-insert-after':{  help : 'run cell, insert below',  help_index : 'bc',  handler : function (env) {  env.notebook.execute_cell_and_insert_below();  }  },  'go-to-command-mode': {  help : 'command mode',  help_index : 'aa',  handler : function (env) {  env.notebook.command_mode();  }  },  'split-cell-at-cursor': {  help : 'split cell',  help_index : 'ea',  handler : function (env) {  env.notebook.split_cell();  }  },  'enter-edit-mode' : {  help_index : 'aa',  handler : function (env) {  env.notebook.edit_mode();  }  },  'select-previous-cell' : {  help: 'select cell above',  help_index : 'da',  handler : function (env) {  var index = env.notebook.get_selected_index();  if (index !== 0 && index !== null) {  env.notebook.select_prev();  env.notebook.focus_cell();  }  }  },  'select-next-cell' : {  help: 'select cell below',  help_index : 'db',  handler : function (env) {  var index = env.notebook.get_selected_index();  if (index !== (env.notebook.ncells()-1) && index !== null) {  env.notebook.select_next();  env.notebook.focus_cell();  }  }  },  'cut-selected-cell' : {  icon: 'fa-cut',  help_index : 'ee',  handler : function (env) {  var index = env.notebook.get_selected_index();  env.notebook.cut_cell();  env.notebook.select(index);  env.notebook.focus_cell();  }  },  'copy-selected-cell' : {  icon: 'fa-copy',  help_index : 'ef',  handler : function (env) {  env.notebook.copy_cell();  env.notebook.focus_cell();  }  },  'paste-cell-before' : {  help: 'paste cell above',  help_index : 'eg',  handler : function (env) {  env.notebook.paste_cell_above();  }  },  'paste-cell-after' : {  help: 'paste cell below',  icon: 'fa-paste',  help_index : 'eh',  handler : function (env) {  env.notebook.paste_cell_below();  }  },  'insert-cell-before' : {  help: 'insert cell above',  help_index : 'ec',  handler : function (env) {  env.notebook.insert_cell_above();  env.notebook.select_prev();  env.notebook.focus_cell();  }  },  'insert-cell-after' : {  help: 'insert cell below',  icon : 'fa-plus',  help_index : 'ed',  handler : function (env) {  env.notebook.insert_cell_below();  env.notebook.select_next();  env.notebook.focus_cell();  }  },  'change-selected-cell-to-code-cell' : {  help : 'to code',  help_index : 'ca',  handler : function (env) {  env.notebook.to_code();  }  },  'change-selected-cell-to-markdown-cell' : {  help : 'to markdown',  help_index : 'cb',  handler : function (env) {  env.notebook.to_markdown();  }  },  'change-selected-cell-to-raw-cell' : {  help : 'to raw',  help_index : 'cc',  handler : function (env) {  env.notebook.to_raw();  }  },  'change-selected-cell-to-heading-1' : {  help : 'to heading 1',  help_index : 'cd',  handler : function (env) {  env.notebook.to_heading(undefined, 1);  }  },  'change-selected-cell-to-heading-2' : {  help : 'to heading 2',  help_index : 'ce',  handler : function (env) {  env.notebook.to_heading(undefined, 2);  }  },  'change-selected-cell-to-heading-3' : {  help : 'to heading 3',  help_index : 'cf',  handler : function (env) {  env.notebook.to_heading(undefined, 3);  }  },  'change-selected-cell-to-heading-4' : {  help : 'to heading 4',  help_index : 'cg',  handler : function (env) {  env.notebook.to_heading(undefined, 4);  }  },  'change-selected-cell-to-heading-5' : {  help : 'to heading 5',  help_index : 'ch',  handler : function (env) {  env.notebook.to_heading(undefined, 5);  }  },  'change-selected-cell-to-heading-6' : {  help : 'to heading 6',  help_index : 'ci',  handler : function (env) {  env.notebook.to_heading(undefined, 6);  }  },  'toggle-output-visibility-selected-cell' : {  help : 'toggle output',  help_index : 'gb',  handler : function (env) {  env.notebook.toggle_output();  }  },  'toggle-output-scrolling-selected-cell' : {  help : 'toggle output scrolling',  help_index : 'gc',  handler : function (env) {  env.notebook.toggle_output_scroll();  }  },  'move-selected-cell-down' : {  icon: 'fa-arrow-down',  help_index : 'eb',  handler : function (env) {  env.notebook.move_cell_down();  }  },  'move-selected-cell-up' : {  icon: 'fa-arrow-up',  help_index : 'ea',  handler : function (env) {  env.notebook.move_cell_up();  }  },  'toggle-line-number-selected-cell' : {  help : 'toggle line numbers',  help_index : 'ga',  handler : function (env) {  env.notebook.cell_toggle_line_numbers();  }  },  'show-keyboard-shortcut-help-dialog' : {  help_index : 'ge',  handler : function (env) {  env.quick_help.show_keyboard_shortcuts();  }  },  'delete-cell': {  help: 'delete selected cell',  help_index : 'ej',  handler : function (env) {  env.notebook.delete_cell();  }  },  'interrupt-kernel':{  icon: 'fa-stop',  help_index : 'ha',  handler : function (env) {  env.notebook.kernel.interrupt();  env.notebook.focus_cell();  }  },  'restart-kernel':{  icon: 'fa-repeat',  help_index : 'hb',  handler : function (env) {  env.notebook.restart_kernel();  env.notebook.focus_cell();  }  },  'undo-last-cell-deletion' : {  help_index : 'ei',  handler : function (env) {  env.notebook.undelete_cell();  }  },  'merge-selected-cell-with-cell-after' : {  help : 'merge cell below',  help_index : 'ek',  handler : function (env) {  env.notebook.merge_cell_below();  }  },  'close-pager' : {  help_index : 'gd',  handler : function (env) {  env.pager.collapse();  }  }  };  /**  * A bunch of `Advance actions` for IPython.  * Cf `Simple Action` plus the following properties.  *  * handler: first argument of the handler is the event that triggerd the action  * (typically keypress). The handler is responsible for any modification of the  * event and event propagation.  * Is also responsible for returning false if the event have to be further ignored,  * true, to tell keyboard manager that it ignored the event.  *  * the second parameter of the handler is the environemnt passed to Simple Actions  *  **/  var custom_ignore = {  'ignore':{  handler : function () {  return true;  }  },  'move-cursor-up-or-previous-cell':{  handler : function (env, event) {  var index = env.notebook.get_selected_index();  var cell = env.notebook.get_cell(index);  var cm = env.notebook.get_selected_cell().code_mirror;  var cur = cm.getCursor();  if (cell && cell.at_top() && index !== 0 && cur.ch === 0) {  if(event){  event.preventDefault();  }  env.notebook.command_mode();  env.notebook.select_prev();  env.notebook.edit_mode();  cm = env.notebook.get_selected_cell().code_mirror;  cm.setCursor(cm.lastLine(), 0);  }  return false;  }  },  'move-cursor-down-or-next-cell':{  handler : function (env, event) {  var index = env.notebook.get_selected_index();  var cell = env.notebook.get_cell(index);  if (cell.at_bottom() && index !== (env.notebook.ncells()-1)) {  if(event){  event.preventDefault();  }  env.notebook.command_mode();  env.notebook.select_next();  env.notebook.edit_mode();  var cm = env.notebook.get_selected_cell().code_mirror;  cm.setCursor(0, 0);  }  return false;  }  },  'scroll-down': {  handler: function(env, event) {  if(event){  event.preventDefault();  }  return env.notebook.scroll_manager.scroll(1);  },  },  'scroll-up': {  handler: function(env, event) {  if(event){  event.preventDefault();  }  return env.notebook.scroll_manager.scroll(-1);  },  },  'save-notebook':{  help: "Save and Checkpoint",  help_index : 'fb',  icon: 'fa-save',  handler : function (env, event) {  env.notebook.save_checkpoint();  if(event){  event.preventDefault();  }  return false;  }  },  };  // private stuff that prepend `.ipython` to actions names  // and uniformize/fill in missing pieces in of an action.  var _prepare_handler = function(registry, subkey, source){  registry['ipython.'+subkey] = {};  registry['ipython.'+subkey].help = source[subkey].help||subkey.replace(/-/g,' ');  registry['ipython.'+subkey].help_index = source[subkey].help_index;  registry['ipython.'+subkey].icon = source[subkey].icon;  return source[subkey].handler;  };  // Will actually generate/register all the IPython actions  var fun = function(){  var final_actions = {};  var k;  for(k in _actions){  if(_actions.hasOwnProperty(k)){  // Js closure are function level not block level need to wrap in a IIFE  // and append ipython to event name these things do intercept event so are wrapped  // in a function that return false.  var handler = _prepare_handler(final_actions, k, _actions);  (function(key, handler){  final_actions['ipython.'+key].handler = function(env, event){  handler(env);  if(event){  event.preventDefault();  }  return false;  };  })(k, handler);  }  }  for(k in custom_ignore){  // Js closure are function level not block level need to wrap in a IIFE  // same as above, but decide for themselves wether or not they intercept events.  if(custom_ignore.hasOwnProperty(k)){  var handler = _prepare_handler(final_actions, k, custom_ignore);  (function(key, handler){  final_actions['ipython.'+key].handler = function(env, event){  return handler(env, event);  };  })(k, handler);  }  }  return final_actions;  };  ActionHandler.prototype._actions = fun();  /**  * extend the environment variable that will be pass to handlers  **/  ActionHandler.prototype.extend_env = function(env){  for(var k in env){  this.env[k] = env[k];  }  };  ActionHandler.prototype.register = function(action, name, prefix){  /**  * Register an `action` with an optional name and prefix.   *  * if name and prefix are not given they will be determined automatically.   * if action if just a `function` it will be wrapped in an anonymous action.  *  * @return the full name to access this action .  **/  action = this.normalise(action);  if( !name ){  name = 'autogenerated-'+String(action.handler);  }  prefix = prefix || 'auto';  var full_name = prefix+'.'+name;  this._actions[full_name] = action;  return full_name;  };  ActionHandler.prototype.normalise = function(data){  /**  * given an `action` or `function`, return a normalised `action`  * by setting all known attributes and removing unknown attributes;  **/  if(typeof(data) === 'function'){  data = {handler:data};  }  if(typeof(data.handler) !== 'function'){  throw('unknown datatype, cannot register');  }  var _data = data;  data = {};  data.handler = _data.handler;  data.help = _data.help || '';  data.icon = _data.icon || '';  data.help_index = _data.help_index || '';  return data;  };  ActionHandler.prototype.get_name = function(name_or_data){  /**  * given an `action` or `name` of a action, return the name attached to this action.  * if given the name of and corresponding actions does not exist in registry, return `null`.  **/  if(typeof(name_or_data) === 'string'){  if(this.exists(name_or_data)){  return name_or_data;  } else {  return null;  }  } else {  return this.register(name_or_data);  }  };  ActionHandler.prototype.get = function(name){  return this._actions[name];  };  ActionHandler.prototype.call = function(name, event, env){  return this._actions[name].handler(env|| this.env, event);  };  ActionHandler.prototype.exists = function(name){  return (typeof(this._actions[name]) !== 'undefined');  };  return {init:ActionHandler};  });           

(function(){var t=this;var e=t.Backbone;var i=[];var r=i.push;var s=i.slice;var n=i.splice;var a;if(typeof exports!=="undefined"){a=exports}else{a=t.Backbone={}}a.VERSION="1.1.0";var h=t._;if(!h&&typeof require!=="undefined")h=require("underscore");a.$=t.jQuery||t.Zepto||t.ender||t.$;a.noConflict=function(){t.Backbone=e;return this};a.emulateHTTP=false;a.emulateJSON=false;var o=a.Events={on:function(t,e,i){if(!l(this,"on",t,[e,i])||!e)return this;this._events||(this._events={});var r=this._events[t]||(this._events[t]=[]);r.push({callback:e,context:i,ctx:i||this});return this},once:function(t,e,i){if(!l(this,"once",t,[e,i])||!e)return this;var r=this;var s=h.once(function(){r.off(t,s);e.apply(this,arguments)});s._callback=e;return this.on(t,s,i)},off:function(t,e,i){var r,s,n,a,o,u,c,f;if(!this._events||!l(this,"off",t,[e,i]))return this;if(!t&&!e&&!i){this._events={};return this}a=t?[t]:h.keys(this._events);for(o=0,u=a.length;o").attr(t);this.setElement(e,false)}else{this.setElement(h.result(this,"el"),false)}}});a.sync=function(t,e,i){var r=T[t];h.defaults(i||(i={}),{emulateHTTP:a.emulateHTTP,emulateJSON:a.emulateJSON});var s={type:r,dataType:"json"};if(!i.url){s.url=h.result(e,"url")||U()}if(i.data==null&&e&&(t==="create"||t==="update"||t==="patch")){s.contentType="application/json";s.data=JSON.stringify(i.attrs||e.toJSON(i))}if(i.emulateJSON){s.contentType="application/x-www-form-urlencoded";s.data=s.data?{model:s.data}:{}}if(i.emulateHTTP&&(r==="PUT"||r==="DELETE"||r==="PATCH")){s.type="POST";if(i.emulateJSON)s.data._method=r;var n=i.beforeSend;i.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",r);if(n)return n.apply(this,arguments)}}if(s.type!=="GET"&&!i.emulateJSON){s.processData=false}if(s.type==="PATCH"&&E){s.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var o=i.xhr=a.ajax(h.extend(s,i));e.trigger("request",e,o,i);return o};var E=typeof window!=="undefined"&&!!window.ActiveXObject&&!(window.XMLHttpRequest&&(new XMLHttpRequest).dispatchEvent);var T={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};a.ajax=function(){return a.$.ajax.apply(a.$,arguments)};var k=a.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var S=/\((.*?)\)/g;var $=/(\(\?)?:\w+/g;var H=/\*\w+/g;var A=/[\-{}\[\]+?.,\\\^$|#\s]/g;h.extend(k.prototype,o,{initialize:function(){},route:function(t,e,i){if(!h.isRegExp(t))t=this._routeToRegExp(t);if(h.isFunction(e)){i=e;e=""}if(!i)i=this[e];var r=this;a.history.route(t,function(s){var n=r._extractParameters(t,s);i&&i.apply(r,n);r.trigger.apply(r,["route:"+e].concat(n));r.trigger("route",e,n);a.history.trigger("route",r,e,n)});return this},navigate:function(t,e){a.history.navigate(t,e);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=h.result(this,"routes");var t,e=h.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(A,"\\$&").replace(S,"(?:$1)?").replace($,function(t,e){return e?t:"([^/]+)"}).replace(H,"(.*?)");return new RegExp("^"+t+"$")},_extractParameters:function(t,e){var i=t.exec(e).slice(1);return h.map(i,function(t){return t?decodeURIComponent(t):null})}});var I=a.History=function(){this.handlers=[];h.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var N=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var P=/msie [\w.]+/;var C=/\/$/;var j=/[?#].*$/;I.started=false;h.extend(I.prototype,o,{interval:50,getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=this.location.pathname;var i=this.root.replace(C,"");if(!t.indexOf(i))t=t.slice(i.length)}else{t=this.getHash()}}return t.replace(N,"")},start:function(t){if(I.started)throw new Error("Backbone.history has already been started");I.started=true;this.options=h.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var e=this.getFragment();var i=document.documentMode;var r=P.exec(navigator.userAgent.toLowerCase())&&(!i||i<=7);this.root=("/"+this.root+"/").replace(O,"/");if(r&&this._wantsHashChange){this.iframe=a.$('').hide().appendTo("body")[0].contentWindow;this.navigate(e)}if(this._hasPushState){a.$(window).on("popstate",this.checkUrl)}else if(this._wantsHashChange&&"onhashchange"in window&&!r){a.$(window).on("hashchange",this.checkUrl)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}this.fragment=e;var s=this.location;var n=s.pathname.replace(/[^\/]$/,"$&/")===this.root;if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!n){this.fragment=this.getFragment(null,true);this.location.replace(this.root+this.location.search+"#"+this.fragment);return true}else if(this._hasPushState&&n&&s.hash){this.fragment=this.getHash().replace(N,"");this.history.replaceState({},document.title,this.root+this.fragment+s.search)}}if(!this.options.silent)return this.loadUrl()},stop:function(){a.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);I.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getFragment(this.getHash(this.iframe))}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()},loadUrl:function(t){t=this.fragment=this.getFragment(t);return h.any(this.handlers,function(e){if(e.route.test(t)){e.callback(t);return true}})},navigate:function(t,e){if(!I.started)return false;if(!e||e===true)e={trigger:!!e};var i=this.root+(t=this.getFragment(t||""));t=t.replace(j,"");if(this.fragment===t)return;this.fragment=t;if(t===""&&i!=="/")i=i.slice(0,-1);if(this._hasPushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,i)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getFragment(this.getHash(this.iframe))){if(!e.replace)this.iframe.document.open().close();this._updateHash(this.iframe.location,t,e.replace)}}else{return this.location.assign(i)}if(e.trigger)return this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});a.history=new I;var R=function(t,e){var i=this;var r;if(t&&h.has(t,"constructor")){r=t.constructor}else{r=function(){return i.apply(this,arguments)}}h.extend(r,i,e);var s=function(){this.constructor=r};s.prototype=i.prototype;r.prototype=new s;if(t)h.extend(r.prototype,t);r.__super__=i.prototype;return r};d.extend=v.extend=k.extend=w.extend=I.extend=R;var U=function(){throw new Error('A "url" property or function must be specified')};var M=function(t,e){var i=e.error;e.error=function(r){if(i)i(t,r,e);t.trigger("error",t,r,e)}}}).call(this);</span>&nbsp; <span class='diff-add'>//# sourceMappingURL=backbone-min.map</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.css b/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.css</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..f98810c</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.css</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>/* ========================================================================</span>&nbsp; <span class='diff-add'> * bootstrap-tour - v0.10.1</span>&nbsp; <span class='diff-add'> * http://bootstraptour.com</span>&nbsp; <span class='diff-add'> * ========================================================================</span>&nbsp; <span class='diff-add'> * Copyright 2012-2013 Ulrich Sossou</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * ========================================================================</span>&nbsp; <span class='diff-add'> * Licensed under the Apache License, Version 2.0 (the "License");</span>&nbsp; <span class='diff-add'> * you may not use this file except in compliance with the License.</span>&nbsp; <span class='diff-add'> * You may obtain a copy of the License at</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * http://www.apache.org/licenses/LICENSE-2.0</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Unless required by applicable law or agreed to in writing, software</span>&nbsp; <span class='diff-add'> * distributed under the License is distributed on an "AS IS" BASIS,</span>&nbsp; <span class='diff-add'> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>&nbsp; <span class='diff-add'> * See the License for the specific language governing permissions and</span>&nbsp; <span class='diff-add'> * limitations under the License.</span>&nbsp; <span class='diff-add'> * ========================================================================</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>.tour-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1100;background-color:#000;opacity:.8;filter:alpha(opacity=80)}.tour-step-backdrop{position:relative;z-index:1101;background:inherit}.tour-step-backdrop>td{position:relative;z-index:1101}.tour-step-background{position:absolute!important;z-index:1100;background:inherit;border-radius:6px}.popover[class*=tour-]{z-index:1100}.popover[class*=tour-] .popover-navigation{padding:9px 14px}.popover[class*=tour-] .popover-navigation [data-role=end]{float:right}.popover[class*=tour-] .popover-navigation [data-role=prev],.popover[class*=tour-] .popover-navigation [data-role=next],.popover[class*=tour-] .popover-navigation [data-role=end]{cursor:pointer}.popover[class*=tour-] .popover-navigation [data-role=prev].disabled,.popover[class*=tour-] .popover-navigation [data-role=next].disabled,.popover[class*=tour-] .popover-navigation [data-role=end].disabled{cursor:default}.popover[class*=tour-].orphan{position:fixed;margin-top:0}.popover[class*=tour-].orphan .arrow{display:none}</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.js b/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..12e7228</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/bootstrap-tour.min.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>/* ========================================================================</span>&nbsp; <span class='diff-add'> * bootstrap-tour - v0.10.1</span>&nbsp; <span class='diff-add'> * http://bootstraptour.com</span>&nbsp; <span class='diff-add'> * ========================================================================</span>&nbsp; <span class='diff-add'> * Copyright 2012-2013 Ulrich Sossou</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * ========================================================================</span>&nbsp; <span class='diff-add'> * Licensed under the Apache License, Version 2.0 (the "License");</span>&nbsp; <span class='diff-add'> * you may not use this file except in compliance with the License.</span>&nbsp; <span class='diff-add'> * You may obtain a copy of the License at</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * http://www.apache.org/licenses/LICENSE-2.0</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Unless required by applicable law or agreed to in writing, software</span>&nbsp; <span class='diff-add'> * distributed under the License is distributed on an "AS IS" BASIS,</span>&nbsp; <span class='diff-add'> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>&nbsp; <span class='diff-add'> * See the License for the specific language governing permissions and</span>&nbsp; <span class='diff-add'> * limitations under the License.</span>&nbsp; <span class='diff-add'> * ========================================================================</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>+function(t){"use strict";function e(e){return this.each(function(){var n=t(this),i=n.data("bs.tooltip"),r="object"==typeof e&&e;(i||"destroy"!=e)&&(i||n.data("bs.tooltip",i=new o(this,r)),"string"==typeof e&&i[e]())})}var o=function(t,e){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",t,e)};o.VERSION="3.2.0",o.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},o.prototype.init=function(e,o,n){this.enabled=!0,this.type=e,this.$element=t(o),this.options=this.getOptions(n),this.$viewport=this.options.viewport&&t(this.options.viewport.selector||this.options.viewport);for(var i=this.options.trigger.split(" "),r=i.length;r--;){var s=i[r];if("click"==s)this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",p="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(p+"."+this.type,this.options.selector,t.proxy(this.leave,this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},o.prototype.getDefaults=function(){return o.DEFAULTS},o.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},o.prototype.getDelegateOptions=function(){var e={},o=this.getDefaults();return this._options&&t.each(this._options,function(t,n){o[t]!=n&&(e[t]=n)}),e},o.prototype.enter=function(e){var o=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return o||(o=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,o)),clearTimeout(o.timeout),o.hoverState="in",o.options.delay&&o.options.delay.show?(o.timeout=setTimeout(function(){"in"==o.hoverState&&o.show()},o.options.delay.show),void 0):o.show()},o.prototype.leave=function(e){var o=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return o||(o=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,o)),clearTimeout(o.timeout),o.hoverState="out",o.options.delay&&o.options.delay.hide?(o.timeout=setTimeout(function(){"out"==o.hoverState&&o.hide()},o.options.delay.hide),void 0):o.hide()},o.prototype.show=function(){var e=t.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var o=t.contains(document.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!o)return;var n=this,i=this.tip(),r=this.getUID(this.type);this.setContent(),i.attr("id",r),this.$element.attr("aria-describedby",r),this.options.animation&&i.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,i[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,p=a.test(s);p&&(s=s.replace(a,"")||"top"),i.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?i.appendTo(this.options.container):i.insertAfter(this.$element);var h=this.getPosition(),l=i[0].offsetWidth,u=i[0].offsetHeight;if(p){var c=s,d=this.$element.parent(),f=this.getPosition(d);s="bottom"==s&&h.top+h.height+u-f.scroll>f.height?"top":"top"==s&&h.top-f.scroll-u<0?"bottom":"right"==s&&h.right+l>f.width?"left":"left"==s&&h.left-l<f.left?"right":s,i.removeClass(c).addClass(s)}var m=this.getCalculatedOffset(s,h,l,u);this.applyPlacement(m,s);var v=function(){n.$element.trigger("shown.bs."+n.type),n.hoverState=null};t.support.transition&&this.$tip.hasClass("fade")?i.one("bsTransitionEnd",v).emulateTransitionEnd(150):v()}},o.prototype.applyPlacement=function(e,o){var n=this.tip(),i=n[0].offsetWidth,r=n[0].offsetHeight,s=parseInt(n.css("margin-top"),10),a=parseInt(n.css("margin-left"),10);isNaN(s)&&(s=0),isNaN(a)&&(a=0),e.top=e.top+s,e.left=e.left+a,t.offset.setOffset(n[0],t.extend({using:function(t){n.css({top:Math.round(t.top),left:Math.round(t.left)})}},e),0),n.addClass("in");var p=n[0].offsetWidth,h=n[0].offsetHeight;"top"==o&&h!=r&&(e.top=e.top+r-h);var l=this.getViewportAdjustedDelta(o,e,p,h);l.left?e.left+=l.left:e.top+=l.top;var u=l.left?2*l.left-i+p:2*l.top-r+h,c=l.left?"left":"top",d=l.left?"offsetWidth":"offsetHeight";n.offset(e),this.replaceArrow(u,n[0][d],c)},o.prototype.replaceArrow=function(t,e,o){this.arrow().css(o,t?50*(1-t/e)+"%":"")},o.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();t.find(".tooltip-inner")[this.options.html?"html":"text"](e),t.removeClass("fade in top bottom left right")},o.prototype.hide=function(){function e(){"in"!=o.hoverState&&n.detach(),o.$element.trigger("hidden.bs."+o.type)}var o=this,n=this.tip(),i=t.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(i),i.isDefaultPrevented()?void 0:(n.removeClass("in"),t.support.transition&&this.$tip.hasClass("fade")?n.one("bsTransitionEnd",e).emulateTransitionEnd(150):e(),this.hoverState=null,this)},o.prototype.fixTitle=function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").attr("title","")},o.prototype.hasContent=function(){return this.getTitle()},o.prototype.getPosition=function(e){e=e||this.$element;var o=e[0],n="BODY"==o.tagName;return t.extend({},"function"==typeof o.getBoundingClientRect?o.getBoundingClientRect():null,{scroll:n?document.documentElement.scrollTop||document.body.scrollTop:e.scrollTop(),width:n?t(window).width():e.outerWidth(),height:n?t(window).height():e.outerHeight()},n?{top:0,left:0}:e.offset())},o.prototype.getCalculatedOffset=function(t,e,o,n){return"bottom"==t?{top:e.top+e.height,left:e.left+e.width/2-o/2}:"top"==t?{top:e.top-n,left:e.left+e.width/2-o/2}:"left"==t?{top:e.top+e.height/2-n/2,left:e.left-o}:{top:e.top+e.height/2-n/2,left:e.left+e.width}},o.prototype.getViewportAdjustedDelta=function(t,e,o,n){var i={top:0,left:0};if(!this.$viewport)return i;var r=this.options.viewport&&this.options.viewport.padding||0,s=this.getPosition(this.$viewport);if(/right|left/.test(t)){var a=e.top-r-s.scroll,p=e.top+r-s.scroll+n;a<s.top?i.top=s.top-a:p>s.top+s.height&&(i.top=s.top+s.height-p)}else{var h=e.left-r,l=e.left+r+o;h<s.left?i.left=s.left-h:l>s.width&&(i.left=s.left+s.width-l)}return i},o.prototype.getTitle=function(){var t,e=this.$element,o=this.options;return t=e.attr("data-original-title")||("function"==typeof o.title?o.title.call(e[0]):o.title)},o.prototype.getUID=function(t){do t+=~~(1e6*Math.random());while(document.getElementById(t));return t},o.prototype.tip=function(){return this.$tip=this.$tip||t(this.options.template)},o.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},o.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},o.prototype.enable=function(){this.enabled=!0},o.prototype.disable=function(){this.enabled=!1},o.prototype.toggleEnabled=function(){this.enabled=!this.enabled},o.prototype.toggle=function(e){var o=this;e&&(o=t(e.currentTarget).data("bs."+this.type),o||(o=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,o))),o.tip().hasClass("in")?o.leave(o):o.enter(o)},o.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var n=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=o,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=n,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var n=t(this),i=n.data("bs.popover"),r="object"==typeof e&&e;(i||"destroy"!=e)&&(i||n.data("bs.popover",i=new o(this,r)),"string"==typeof e&&i[e]())})}var o=function(t,e){this.init("popover",t,e)};if(!t.fn.tooltip)throw new Error("Popover requires tooltip.js");o.VERSION="3.2.0",o.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),o.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),o.prototype.constructor=o,o.prototype.getDefaults=function(){return o.DEFAULTS},o.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),o=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").empty()[this.options.html?"string"==typeof o?"html":"append":"text"](o),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},o.prototype.hasContent=function(){return this.getTitle()||this.getContent()},o.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},o.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},o.prototype.tip=function(){return this.$tip||(this.$tip=t(this.options.template)),this.$tip};var n=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=o,t.fn.popover.noConflict=function(){return t.fn.popover=n,this}}(jQuery),function(t,e){var o,n;return n=e.document,o=function(){function o(o){var n;try{n=e.localStorage}catch(i){n=!1}this._options=t.extend({name:"tour",steps:[],container:"body",autoscroll:!0,keyboard:!0,storage:n,debug:!1,backdrop:!1,backdropPadding:0,redirect:!0,orphan:!1,duration:!1,delay:!1,basePath:"",template:'<div class="popover" role="tooltip"> <div class="arrow"></div> <h3 class="popover-title"></h3> <div class="popover-content"></div> <div class="popover-navigation"> <div class="btn-group"> <button class="btn btn-sm btn-default" data-role="prev">&laquo; Prev</button> <button class="btn btn-sm btn-default" data-role="next">Next &raquo;</button> <button class="btn btn-sm btn-default" data-role="pause-resume" data-pause-text="Pause" data-resume-text="Resume">Pause</button> </div> <button class="btn btn-sm btn-default" data-role="end">End tour</button> </div> </div>',afterSetState:function(){},afterGetState:function(){},afterRemoveState:function(){},onStart:function(){},onEnd:function(){},onShow:function(){},onShown:function(){},onHide:function(){},onHidden:function(){},onNext:function(){},onPrev:function(){},onPause:function(){},onResume:function(){}},o),this._force=!1,this._inited=!1,this.backdrop={overlay:null,$element:null,$background:null,backgroundShown:!1,overlayElementShown:!1}}return o.prototype.addSteps=function(t){var e,o,n;for(o=0,n=t.length;n>o;o++)e=t[o],this.addStep(e);return this},o.prototype.addStep=function(t){return this._options.steps.push(t),this},o.prototype.getStep=function(e){return null!=this._options.steps[e]?t.extend({id:"step-"+e,path:"",placement:"right",title:"",content:"<p></p>",next:e===this._options.steps.length-1?-1:e+1,prev:e-1,animation:!0,container:this._options.container,autoscroll:this._options.autoscroll,backdrop:this._options.backdrop,backdropPadding:this._options.backdropPadding,redirect:this._options.redirect,orphan:this._options.orphan,duration:this._options.duration,delay:this._options.delay,template:this._options.template,onShow:this._options.onShow,onShown:this._options.onShown,onHide:this._options.onHide,onHidden:this._options.onHidden,onNext:this._options.onNext,onPrev:this._options.onPrev,onPause:this._options.onPause,onResume:this._options.onResume},this._options.steps[e]):void 0},o.prototype.init=function(t){return this._force=t,this.ended()?(this._debug("Tour ended, init prevented."),this):(this.setCurrentStep(),this._initMouseNavigation(),this._initKeyboardNavigation(),this._onResize(function(t){return function(){return t.showStep(t._current)}}(this)),null!==this._current&&this.showStep(this._current),this._inited=!0,this)},o.prototype.start=function(t){var e;return null==t&&(t=!1),this._inited||this.init(t),null===this._current&&(e=this._makePromise(null!=this._options.onStart?this._options.onStart(this):void 0),this._callOnPromiseDone(e,this.showStep,0)),this},o.prototype.next=function(){var t;return t=this.hideStep(this._current),this._callOnPromiseDone(t,this._showNextStep)},o.prototype.prev=function(){var t;return t=this.hideStep(this._current),this._callOnPromiseDone(t,this._showPrevStep)},o.prototype.goTo=function(t){var e;return e=this.hideStep(this._current),this._callOnPromiseDone(e,this.showStep,t)},o.prototype.end=function(){var o,i;return o=function(o){return function(){return t(n).off("click.tour-"+o._options.name),t(n).off("keyup.tour-"+o._options.name),t(e).off("resize.tour-"+o._options.name),o._setState("end","yes"),o._inited=!1,o._force=!1,o._clearTimer(),null!=o._options.onEnd?o._options.onEnd(o):void 0}}(this),i=this.hideStep(this._current),this._callOnPromiseDone(i,o)},o.prototype.ended=function(){return!this._force&&!!this._getState("end")},o.prototype.restart=function(){return this._removeState("current_step"),this._removeState("end"),this.start()},o.prototype.pause=function(){var t;return t=this.getStep(this._current),t&&t.duration?(this._paused=!0,this._duration-=(new Date).getTime()-this._start,e.clearTimeout(this._timer),this._debug("Paused/Stopped step "+(this._current+1)+" timer ("+this._duration+" remaining)."),null!=t.onPause?t.onPause(this,this._duration):void 0):this},o.prototype.resume=function(){var t;return t=this.getStep(this._current),t&&t.duration?(this._paused=!1,this._start=(new Date).getTime(),this._duration=this._duration||t.duration,this._timer=e.setTimeout(function(t){return function(){return t._isLast()?t.next():t.end()}}(this),this._duration),this._debug("Started step "+(this._current+1)+" timer with duration "+this._duration),null!=t.onResume&&this._duration!==t.duration?t.onResume(this,this._duration):void 0):this},o.prototype.hideStep=function(e){var o,n,i;return(i=this.getStep(e))?(this._clearTimer(),n=this._makePromise(null!=i.onHide?i.onHide(this,e):void 0),o=function(o){return function(){var n;return n=t(i.element),n.data("bs.popover")||n.data("popover")||(n=t("body")),n.popover("destroy").removeClass("tour-"+o._options.name+"-element tour-"+o._options.name+"-"+e+"-element"),i.reflex&&n.removeClass("tour-step-element-reflex").off(""+o._reflexEvent(i.reflex)+".tour-"+o._options.name),i.backdrop&&o._hideBackdrop(),null!=i.onHidden?i.onHidden(o):void 0}}(this),this._callOnPromiseDone(n,o),n):void 0},o.prototype.showStep=function(t){var o,i,r,s;return this.ended()?(this._debug("Tour ended, showStep prevented."),this):(s=this.getStep(t))?(r=t<this._current,o=this._makePromise(null!=s.onShow?s.onShow(this,t):void 0),i=function(e){return function(){var o,i,a;if(e.setCurrentStep(t),i=function(){switch({}.toString.call(s.path)){case"[object Function]":return s.path();case"[object String]":return this._options.basePath+s.path;default:return s.path}}.call(e),o=[n.location.pathname,n.location.hash].join(""),e._isRedirect(i,o))return e._redirect(s,i),void 0;if(e._isOrphan(s)){if(!s.orphan)return e._debug("Skip the orphan step "+(e._current+1)+".\nOrphan option is false and the element does not exist or is hidden."),r?e._showPrevStep():e._showNextStep(),void 0;e._debug("Show the orphan step "+(e._current+1)+". Orphans option is true.")}return s.backdrop&&e._showBackdrop(e._isOrphan(s)?void 0:s.element),a=function(){return e.getCurrentStep()===t?(null!=s.element&&s.backdrop&&e._showOverlayElement(s),e._showPopover(s,t),null!=s.onShown&&s.onShown(e),e._debug("Step "+(e._current+1)+" of "+e._options.steps.length)):void 0},s.autoscroll?e._scrollIntoView(s.element,a):a(),s.duration?e.resume():void 0}}(this),s.delay?(this._debug("Wait "+s.delay+" milliseconds to show the step "+(this._current+1)),e.setTimeout(function(t){return function(){return t._callOnPromiseDone(o,i)}}(this),s.delay)):this._callOnPromiseDone(o,i),o):void 0},o.prototype.getCurrentStep=function(){return this._current},o.prototype.setCurrentStep=function(t){return null!=t?(this._current=t,this._setState("current_step",t)):(this._current=this._getState("current_step"),this._current=null===this._current?null:parseInt(this._current,10)),this},o.prototype._setState=function(t,e){var o,n;if(this._options.storage){n=""+this._options.name+"_"+t;try{this._options.storage.setItem(n,e)}catch(i){o=i,o.code===DOMException.QUOTA_EXCEEDED_ERR&&this.debug("LocalStorage quota exceeded. State storage failed.")}return this._options.afterSetState(n,e)}return null==this._state&&(this._state={}),this._state[t]=e},o.prototype._removeState=function(t){var e;return this._options.storage?(e=""+this._options.name+"_"+t,this._options.storage.removeItem(e),this._options.afterRemoveState(e)):null!=this._state?delete this._state[t]:void 0},o.prototype._getState=function(t){var e,o;return this._options.storage?(e=""+this._options.name+"_"+t,o=this._options.storage.getItem(e)):null!=this._state&&(o=this._state[t]),(void 0===o||"null"===o)&&(o=null),this._options.afterGetState(t,o),o},o.prototype._showNextStep=function(){var t,e,o;return o=this.getStep(this._current),e=function(t){return function(){return t.showStep(o.next)}}(this),t=this._makePromise(null!=o.onNext?o.onNext(this):void 0),this._callOnPromiseDone(t,e)},o.prototype._showPrevStep=function(){var t,e,o;return o=this.getStep(this._current),e=function(t){return function(){return t.showStep(o.prev)}}(this),t=this._makePromise(null!=o.onPrev?o.onPrev(this):void 0),this._callOnPromiseDone(t,e)},o.prototype._debug=function(t){return this._options.debug?e.console.log("Bootstrap Tour '"+this._options.name+"' | "+t):void 0},o.prototype._isRedirect=function(t,e){return null!=t&&""!==t&&("[object RegExp]"==={}.toString.call(t)&&!t.test(e)||"[object String]"==={}.toString.call(t)&&t.replace(/\?.*$/,"").replace(/\/?$/,"")!==e.replace(/\/?$/,""))},o.prototype._redirect=function(e,o){return t.isFunction(e.redirect)?e.redirect.call(this,o):e.redirect===!0?(this._debug("Redirect to "+o),n.location.href=o):void 0},o.prototype._isOrphan=function(e){return null==e.element||!t(e.element).length||t(e.element).is(":hidden")&&"http://www.w3.org/2000/svg"!==t(e.element)[0].namespaceURI},o.prototype._isLast=function(){return this._current<this._options.steps.length-1},o.prototype._showPopover=function(e,o){var n,i,r,s;return t(".tour-"+this._options.name).remove(),s=t.extend({},this._options),r=this._isOrphan(e),e.template=this._template(e,o),r&&(e.element="body",e.placement="top"),n=t(e.element),n.addClass("tour-"+this._options.name+"-element tour-"+this._options.name+"-"+o+"-element"),e.options&&t.extend(s,e.options),e.reflex&&!r&&(n.addClass("tour-step-element-reflex"),n.off(""+this._reflexEvent(e.reflex)+".tour-"+this._options.name),n.on(""+this._reflexEvent(e.reflex)+".tour-"+this._options.name,function(t){return function(){return t._isLast()?t.next():t.end()}}(this))),n.popover({placement:e.placement,trigger:"manual",title:e.title,content:e.content,html:!0,animation:e.animation,container:e.container,template:e.template,selector:e.element}).popover("show"),i=n.data("bs.popover")?n.data("bs.popover").tip():n.data("popover").tip(),i.attr("id",e.id),this._reposition(i,e),r?this._center(i):void 0},o.prototype._template=function(e,o){var n,i,r,s;return s=t.isFunction(e.template)?t(e.template(o,e)):t(e.template),n=s.find(".popover-navigation"),r=n.find('[data-role="prev"]'),i=n.find('[data-role="next"]'),this._isOrphan(e)&&s.addClass("orphan"),s.addClass("tour-"+this._options.name+" tour-"+this._options.name+"-"+o),e.prev<0&&n.find('[data-role="prev"]').addClass("disabled"),e.next<0&&n.find('[data-role="next"]').addClass("disabled"),e.duration||n.find('[data-role="pause-resume"]').remove(),s.clone().wrap("<div>").parent().html()},o.prototype._reflexEvent=function(t){return"[object Boolean]"==={}.toString.call(t)?"click":t},o.prototype._reposition=function(e,o){var i,r,s,a,p,h,l;if(a=e[0].offsetWidth,r=e[0].offsetHeight,l=e.offset(),p=l.left,h=l.top,i=t(n).outerHeight()-l.top-e.outerHeight(),0>i&&(l.top=l.top+i),s=t("html").outerWidth()-l.left-e.outerWidth(),0>s&&(l.left=l.left+s),l.top<0&&(l.top=0),l.left<0&&(l.left=0),e.offset(l),"bottom"===o.placement||"top"===o.placement){if(p!==l.left)return this._replaceArrow(e,2*(l.left-p),a,"left")}else if(h!==l.top)return this._replaceArrow(e,2*(l.top-h),r,"top")},o.prototype._center=function(o){return o.css("top",t(e).outerHeight()/2-o.outerHeight()/2)},o.prototype._replaceArrow=function(t,e,o,n){return t.find(".arrow").css(n,e?50*(1-e/o)+"%":"")},o.prototype._scrollIntoView=function(o,n){var i,r,s,a,p,h;return i=t(o),i.length?(r=t(e),a=i.offset().top,h=r.height(),p=Math.max(0,a-h/2),this._debug("Scroll into view. ScrollTop: "+p+". Element offset: "+a+". Window height: "+h+"."),s=0,t("body, html").stop(!0,!0).animate({scrollTop:Math.ceil(p)},function(t){return function(){return 2===++s?(n(),t._debug("Scroll into view.\nAnimation end element offset: "+i.offset().top+".\nWindow height: "+r.height()+".")):void 0}}(this))):n()},o.prototype._onResize=function(o,n){return t(e).on("resize.tour-"+this._options.name,function(){return clearTimeout(n),n=setTimeout(o,100)})},o.prototype._initMouseNavigation=function(){var e;return e=this,t(n).off("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='prev']").off("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='next']").off("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='end']").off("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='pause-resume']").on("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='next']",function(t){return function(e){return e.preventDefault(),t.next()}}(this)).on("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='prev']",function(t){return function(e){return e.preventDefault(),t.prev()}}(this)).on("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='end']",function(t){return function(e){return e.preventDefault(),t.end()}}(this)).on("click.tour-"+this._options.name,".popover.tour-"+this._options.name+" *[data-role='pause-resume']",function(o){var n;return o.preventDefault(),n=t(this),n.text(e._paused?n.data("pause-text"):n.data("resume-text")),e._paused?e.resume():e.pause()})},o.prototype._initKeyboardNavigation=function(){return this._options.keyboard?t(n).on("keyup.tour-"+this._options.name,function(t){return function(e){if(e.which)switch(e.which){case 39:return e.preventDefault(),t._isLast()?t.next():t.end();case 37:if(e.preventDefault(),t._current>0)return t.prev();break;case 27:return e.preventDefault(),t.end()}}}(this)):void 0},o.prototype._makePromise=function(e){return e&&t.isFunction(e.then)?e:null},o.prototype._callOnPromiseDone=function(t,e,o){return t?t.then(function(t){return function(){return e.call(t,o)}}(this)):e.call(this,o)},o.prototype._showBackdrop=function(){return this.backdrop.backgroundShown?void 0:(this.backdrop=t("<div>",{"class":"tour-backdrop"}),this.backdrop.backgroundShown=!0,t("body").append(this.backdrop))},o.prototype._hideBackdrop=function(){return this._hideOverlayElement(),this._hideBackground()},o.prototype._hideBackground=function(){return this.backdrop?(this.backdrop.remove(),this.backdrop.overlay=null,this.backdrop.backgroundShown=!1):void 0},o.prototype._showOverlayElement=function(e){var o,n;return o=t(e.element),o&&0!==o.length&&!this.backdrop.overlayElementShown?(this.backdrop.overlayElementShown=!0,this.backdrop.$element=o.addClass("tour-step-backdrop"),this.backdrop.$background=t("<div>",{"class":"tour-step-background"}),n={width:o.innerWidth(),height:o.innerHeight(),offset:o.offset()},this.backdrop.$background.appendTo("body"),e.backdropPadding&&(n=this._applyBackdropPadding(e.backdropPadding,n)),this.backdrop.$background.width(n.width).height(n.height).offset(n.offset)):void 0},o.prototype._hideOverlayElement=function(){return this.backdrop.overlayElementShown?(this.backdrop.$element.removeClass("tour-step-backdrop"),this.backdrop.$background.remove(),this.backdrop.$element=null,this.backdrop.$background=null,this.backdrop.overlayElementShown=!1):void 0},o.prototype._applyBackdropPadding=function(t,e){return"object"==typeof t?(null==t.top&&(t.top=0),null==t.right&&(t.right=0),null==t.bottom&&(t.bottom=0),null==t.left&&(t.left=0),e.offset.top=e.offset.top-t.top,e.offset.left=e.offset.left-t.left,e.width=e.width+t.left+t.right,e.height=e.height+t.top+t.bottom):(e.offset.top=e.offset.top-t,e.offset.left=e.offset.left-t,e.width=e.width+2*t,e.height=e.height+2*t),e},o.prototype._clearTimer=function(){return e.clearTimeout(this._timer),this._timer=null,this._duration=null},o}(),e.Tour=o}(jQuery,window);</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/bootstrap.min.js b/ipynb/Array-feature-overlap-05_files/bootstrap.min.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..d839865</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/bootstrap.min.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*!</span>&nbsp; <span class='diff-add'> * Bootstrap v3.3.1 (http://getbootstrap.com)</span>&nbsp; <span class='diff-add'> * Copyright 2011-2014 Twitter, Inc.</span>&nbsp; <span class='diff-add'> * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.1",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.1",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.1",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.1",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.1",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.options.backdrop&&d.adjustBackdrop(),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$element.find(".modal-dialog").one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').prependTo(this.$element).on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.options.backdrop&&this.adjustBackdrop(),this.adjustDialog()},c.prototype.adjustBackdrop=function(){this.$backdrop.css("height",0).css("height",this.$element[0].scrollHeight)},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){this.bodyIsOverflowing=document.body.scrollHeight>document.documentElement.clientHeight,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.tooltip",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.1",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=this.tip(),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.popover",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.1",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.1",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.1",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})</span>&nbsp; <span class='diff-add'>})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.1",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=i?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a("body").height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/cell.js b/ipynb/Array-feature-overlap-05_files/cell.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..1f8f8e1</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/cell.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @module cell</span>&nbsp; <span class='diff-add'> * @namespace cell</span>&nbsp; <span class='diff-add'> * @class Cell</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'codemirror/lib/codemirror',</span>&nbsp; <span class='diff-add'> 'codemirror/addon/edit/matchbrackets',</span>&nbsp; <span class='diff-add'> 'codemirror/addon/edit/closebrackets',</span>&nbsp; <span class='diff-add'> 'codemirror/addon/comment/comment'</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils, CodeMirror, cm_match, cm_closeb, cm_comment) {</span>&nbsp; <span class='diff-add'> // TODO: remove IPython dependency here </span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var overlayHack = CodeMirror.scrollbarModel.native.prototype.overlayHack;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CodeMirror.scrollbarModel.native.prototype.overlayHack = function () {</span>&nbsp; <span class='diff-add'> overlayHack.apply(this, arguments);</span>&nbsp; <span class='diff-add'> // Reverse `min-height: 18px` scrollbar hack on OS X</span>&nbsp; <span class='diff-add'> // which causes a dead area, making it impossible to click on the last line</span>&nbsp; <span class='diff-add'> // when there is horizontal scrolling to do and the "show scrollbar only when scrolling" behavior</span>&nbsp; <span class='diff-add'> // is enabled.</span>&nbsp; <span class='diff-add'> // This, in turn, has the undesirable behavior of never showing the horizontal scrollbar,</span>&nbsp; <span class='diff-add'> // even when it should, which is less problematic, at least.</span>&nbsp; <span class='diff-add'> if (/Mac/.test(navigator.platform)) {</span>&nbsp; <span class='diff-add'> this.horiz.style.minHeight = "";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var Cell = function (options) {</span>&nbsp; <span class='diff-add'> /* Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * The Base `Cell` class from which to inherit.</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param:</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> * events: $(Events) instance</span>&nbsp; <span class='diff-add'> * config: dictionary</span>&nbsp; <span class='diff-add'> * keyboard_manager: KeyboardManager instance</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span>&nbsp; <span class='diff-add'> this.events = options.events;</span>&nbsp; <span class='diff-add'> var config = utils.mergeopt(Cell, options.config);</span>&nbsp; <span class='diff-add'> // superclass default overwrite our default</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.placeholder = config.placeholder || '';</span>&nbsp; <span class='diff-add'> this.read_only = config.cm_config.readOnly;</span>&nbsp; <span class='diff-add'> this.selected = false;</span>&nbsp; <span class='diff-add'> this.rendered = false;</span>&nbsp; <span class='diff-add'> this.mode = 'command';</span>&nbsp; <span class='diff-add'> // Metadata property</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this._metadata = {};</span>&nbsp; <span class='diff-add'> Object.defineProperty(this, 'metadata', {</span>&nbsp; <span class='diff-add'> get: function() { return that._metadata; },</span>&nbsp; <span class='diff-add'> set: function(value) {</span>&nbsp; <span class='diff-add'> that._metadata = value;</span>&nbsp; <span class='diff-add'> if (that.celltoolbar) {</span>&nbsp; <span class='diff-add'> that.celltoolbar.rebuild();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // load this from metadata later ?</span>&nbsp; <span class='diff-add'> this.user_highlight = 'auto';</span>&nbsp; <span class='diff-add'> this.cm_config = config.cm_config;</span>&nbsp; <span class='diff-add'> this.cell_id = utils.uuid();</span>&nbsp; <span class='diff-add'> this._options = config;</span>&nbsp; <span class='diff-add'> // For JS VM engines optimization, attributes should be all set (even</span>&nbsp; <span class='diff-add'> // to null) in the constructor, and if possible, if different subclass</span>&nbsp; <span class='diff-add'> // have new attributes with same name, they should be created in the</span>&nbsp; <span class='diff-add'> // same order. Easiest is to create and set to null in parent class.</span>&nbsp; <span class='diff-add'> this.element = null;</span>&nbsp; <span class='diff-add'> this.cell_type = this.cell_type || null;</span>&nbsp; <span class='diff-add'> this.code_mirror = null;</span>&nbsp; <span class='diff-add'> this.create_element();</span>&nbsp; <span class='diff-add'> if (this.element !== null) {</span>&nbsp; <span class='diff-add'> this.element.data("cell", this);</span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> this.init_classes();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Cell.options_default = {</span>&nbsp; <span class='diff-add'> cm_config : {</span>&nbsp; <span class='diff-add'> indentUnit : 4,</span>&nbsp; <span class='diff-add'> readOnly: false,</span>&nbsp; <span class='diff-add'> theme: "default",</span>&nbsp; <span class='diff-add'> extraKeys: {</span>&nbsp; <span class='diff-add'> "Cmd-Right":"goLineRight",</span>&nbsp; <span class='diff-add'> "End":"goLineRight",</span>&nbsp; <span class='diff-add'> "Cmd-Left":"goLineLeft"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // FIXME: Workaround CM Bug #332 (Safari segfault on drag)</span>&nbsp; <span class='diff-add'> // by disabling drag/drop altogether on Safari</span>&nbsp; <span class='diff-add'> // https://github.com/codemirror/CodeMirror/issues/332 </span>&nbsp; <span class='diff-add'> if (utils.browser[0] == "Safari") {</span>&nbsp; <span class='diff-add'> Cell.options_default.cm_config.dragDrop = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Empty. Subclasses must implement create_element.</span>&nbsp; <span class='diff-add'> * This should contain all the code to create the DOM element in notebook</span>&nbsp; <span class='diff-add'> * and will be called by Base Class constructor.</span>&nbsp; <span class='diff-add'> * @method create_element</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.create_element = function () {</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Cell.prototype.init_classes = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Call after this.element exists to initialize the css classes</span>&nbsp; <span class='diff-add'> * related to selected, rendered and mode.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this.selected) {</span>&nbsp; <span class='diff-add'> this.element.addClass('selected');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.element.addClass('unselected');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.rendered) {</span>&nbsp; <span class='diff-add'> this.element.addClass('rendered');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.element.addClass('unrendered');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Subclasses can implement override bind_events.</span>&nbsp; <span class='diff-add'> * Be carefull to call the parent method when overwriting as it fires event.</span>&nbsp; <span class='diff-add'> * this will be triggerd after create_element in constructor.</span>&nbsp; <span class='diff-add'> * @method bind_events</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> // We trigger events so that Cell doesn't have to depend on Notebook.</span>&nbsp; <span class='diff-add'> that.element.click(function (event) {</span>&nbsp; <span class='diff-add'> if (!that.selected) {</span>&nbsp; <span class='diff-add'> that.events.trigger('select.Cell', {'cell':that});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> that.element.focusin(function (event) {</span>&nbsp; <span class='diff-add'> if (!that.selected) {</span>&nbsp; <span class='diff-add'> that.events.trigger('select.Cell', {'cell':that});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (this.code_mirror) {</span>&nbsp; <span class='diff-add'> this.code_mirror.on("change", function(cm, change) {</span>&nbsp; <span class='diff-add'> that.events.trigger("set_dirty.Notebook", {value: true});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.code_mirror) {</span>&nbsp; <span class='diff-add'> this.code_mirror.on('focus', function(cm, change) {</span>&nbsp; <span class='diff-add'> that.events.trigger('edit_mode.Cell', {cell: that});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.code_mirror) {</span>&nbsp; <span class='diff-add'> this.code_mirror.on('blur', function(cm, change) {</span>&nbsp; <span class='diff-add'> that.events.trigger('command_mode.Cell', {cell: that});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.element.dblclick(function () {</span>&nbsp; <span class='diff-add'> if (that.selected === false) {</span>&nbsp; <span class='diff-add'> this.events.trigger('select.Cell', {'cell':that});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var cont = that.unrender();</span>&nbsp; <span class='diff-add'> if (cont) {</span>&nbsp; <span class='diff-add'> that.focus_editor();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * This method gets called in CodeMirror's onKeyDown/onKeyPress</span>&nbsp; <span class='diff-add'> * handlers and is used to provide custom key handling.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * To have custom handling, subclasses should override this method, but still call it</span>&nbsp; <span class='diff-add'> * in order to process the Edit mode keyboard shortcuts.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method handle_codemirror_keyevent</span>&nbsp; <span class='diff-add'> * @param {CodeMirror} editor - The codemirror instance bound to the cell</span>&nbsp; <span class='diff-add'> * @param {event} event - key press event which either should or should not be handled by CodeMirror</span>&nbsp; <span class='diff-add'> * @return {Boolean} `true` if CodeMirror should ignore the event, `false` Otherwise</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.handle_codemirror_keyevent = function (editor, event) {</span>&nbsp; <span class='diff-add'> var shortcuts = this.keyboard_manager.edit_shortcuts;</span>&nbsp; <span class='diff-add'> var cur = editor.getCursor();</span>&nbsp; <span class='diff-add'> if((cur.line !== 0 || cur.ch !==0) && event.keyCode === 38){</span>&nbsp; <span class='diff-add'> event._ipkmIgnore = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var nLastLine = editor.lastLine();</span>&nbsp; <span class='diff-add'> if ((event.keyCode === 40) &&</span>&nbsp; <span class='diff-add'> ((cur.line !== nLastLine) ||</span>&nbsp; <span class='diff-add'> (cur.ch !== editor.getLineHandle(nLastLine).text.length))</span>&nbsp; <span class='diff-add'> ) {</span>&nbsp; <span class='diff-add'> event._ipkmIgnore = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // if this is an edit_shortcuts shortcut, the global keyboard/shortcut</span>&nbsp; <span class='diff-add'> // manager will handle it</span>&nbsp; <span class='diff-add'> if (shortcuts.handles(event)) {</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Triger typsetting of math by mathjax on current cell element</span>&nbsp; <span class='diff-add'> * @method typeset</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.typeset = function () {</span>&nbsp; <span class='diff-add'> utils.typeset(this.element);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * handle cell level logic when a cell is selected</span>&nbsp; <span class='diff-add'> * @method select</span>&nbsp; <span class='diff-add'> * @return is the action being taken</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.select = function () {</span>&nbsp; <span class='diff-add'> if (!this.selected) {</span>&nbsp; <span class='diff-add'> this.element.addClass('selected');</span>&nbsp; <span class='diff-add'> this.element.removeClass('unselected');</span>&nbsp; <span class='diff-add'> this.selected = true;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * handle cell level logic when a cell is unselected</span>&nbsp; <span class='diff-add'> * @method unselect</span>&nbsp; <span class='diff-add'> * @return is the action being taken</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.unselect = function () {</span>&nbsp; <span class='diff-add'> if (this.selected) {</span>&nbsp; <span class='diff-add'> this.element.addClass('unselected');</span>&nbsp; <span class='diff-add'> this.element.removeClass('selected');</span>&nbsp; <span class='diff-add'> this.selected = false;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * should be overritten by subclass</span>&nbsp; <span class='diff-add'> * @method execute</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.execute = function () {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * handle cell level logic when a cell is rendered</span>&nbsp; <span class='diff-add'> * @method render</span>&nbsp; <span class='diff-add'> * @return is the action being taken</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.render = function () {</span>&nbsp; <span class='diff-add'> if (!this.rendered) {</span>&nbsp; <span class='diff-add'> this.element.addClass('rendered');</span>&nbsp; <span class='diff-add'> this.element.removeClass('unrendered');</span>&nbsp; <span class='diff-add'> this.rendered = true;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * handle cell level logic when a cell is unrendered</span>&nbsp; <span class='diff-add'> * @method unrender</span>&nbsp; <span class='diff-add'> * @return is the action being taken</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.unrender = function () {</span>&nbsp; <span class='diff-add'> if (this.rendered) {</span>&nbsp; <span class='diff-add'> this.element.addClass('unrendered');</span>&nbsp; <span class='diff-add'> this.element.removeClass('rendered');</span>&nbsp; <span class='diff-add'> this.rendered = false;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Delegates keyboard shortcut handling to either IPython keyboard</span>&nbsp; <span class='diff-add'> * manager when in command mode, or CodeMirror when in edit mode</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method handle_keyevent</span>&nbsp; <span class='diff-add'> * @param {CodeMirror} editor - The codemirror instance bound to the cell</span>&nbsp; <span class='diff-add'> * @param {event} - key event to be handled</span>&nbsp; <span class='diff-add'> * @return {Boolean} `true` if CodeMirror should ignore the event, `false` Otherwise</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.handle_keyevent = function (editor, event) {</span>&nbsp; <span class='diff-add'> if (this.mode === 'command') {</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else if (this.mode === 'edit') {</span>&nbsp; <span class='diff-add'> return this.handle_codemirror_keyevent(editor, event);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @method at_top</span>&nbsp; <span class='diff-add'> * @return {Boolean}</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.at_top = function () {</span>&nbsp; <span class='diff-add'> var cm = this.code_mirror;</span>&nbsp; <span class='diff-add'> var cursor = cm.getCursor();</span>&nbsp; <span class='diff-add'> if (cursor.line === 0 && cursor.ch === 0) {</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @method at_bottom</span>&nbsp; <span class='diff-add'> * @return {Boolean}</span>&nbsp; <span class='diff-add'> * */</span>&nbsp; <span class='diff-add'> Cell.prototype.at_bottom = function () {</span>&nbsp; <span class='diff-add'> var cm = this.code_mirror;</span>&nbsp; <span class='diff-add'> var cursor = cm.getCursor();</span>&nbsp; <span class='diff-add'> if (cursor.line === (cm.lineCount()-1) && cursor.ch === cm.getLine(cursor.line).length) {</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * enter the command mode for the cell</span>&nbsp; <span class='diff-add'> * @method command_mode</span>&nbsp; <span class='diff-add'> * @return is the action being taken</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.command_mode = function () {</span>&nbsp; <span class='diff-add'> if (this.mode !== 'command') {</span>&nbsp; <span class='diff-add'> this.mode = 'command';</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * enter the edit mode for the cell</span>&nbsp; <span class='diff-add'> * @method command_mode</span>&nbsp; <span class='diff-add'> * @return is the action being taken</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.edit_mode = function () {</span>&nbsp; <span class='diff-add'> if (this.mode !== 'edit') {</span>&nbsp; <span class='diff-add'> this.mode = 'edit';</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Focus the cell in the DOM sense</span>&nbsp; <span class='diff-add'> * @method focus_cell</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.focus_cell = function () {</span>&nbsp; <span class='diff-add'> this.element.focus();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Focus the editor area so a user can type</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * NOTE: If codemirror is focused via a mouse click event, you don't want to</span>&nbsp; <span class='diff-add'> * call this because it will cause a page jump.</span>&nbsp; <span class='diff-add'> * @method focus_editor</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.focus_editor = function () {</span>&nbsp; <span class='diff-add'> this.refresh();</span>&nbsp; <span class='diff-add'> this.code_mirror.focus();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Refresh codemirror instance</span>&nbsp; <span class='diff-add'> * @method refresh</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.refresh = function () {</span>&nbsp; <span class='diff-add'> if (this.code_mirror) {</span>&nbsp; <span class='diff-add'> this.code_mirror.refresh();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * should be overritten by subclass</span>&nbsp; <span class='diff-add'> * @method get_text</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.get_text = function () {</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * should be overritten by subclass</span>&nbsp; <span class='diff-add'> * @method set_text</span>&nbsp; <span class='diff-add'> * @param {string} text</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.set_text = function (text) {</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * should be overritten by subclass</span>&nbsp; <span class='diff-add'> * serialise cell to json.</span>&nbsp; <span class='diff-add'> * @method toJSON</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Cell.prototype.toJSON = function () {</span>&nbsp; <span class='diff-add'> var data = {};</span>&nbsp; <span class='diff-add'> // deepcopy the metadata so copied cells don't share the same object</span>&nbsp; <span class='diff-add'> data.metadata = JSON.parse(JSON.stringify(this.metadata));</span>&nbsp; <span class='diff-add'> data.cell_type = this.cell_type;</span>&nbsp; <span class='diff-add'> return data;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * should be overritten by subclass</span>&nbsp; <span class='diff-add'> * @method fromJSON</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Cell.prototype.fromJSON = function (data) {</span>&nbsp; <span class='diff-add'> if (data.metadata !== undefined) {</span>&nbsp; <span class='diff-add'> this.metadata = data.metadata;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * can the cell be split into two cells (false if not deletable)</span>&nbsp; <span class='diff-add'> * @method is_splittable</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Cell.prototype.is_splittable = function () {</span>&nbsp; <span class='diff-add'> return this.is_deletable();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * can the cell be merged with other cells (false if not deletable)</span>&nbsp; <span class='diff-add'> * @method is_mergeable</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Cell.prototype.is_mergeable = function () {</span>&nbsp; <span class='diff-add'> return this.is_deletable();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * is the cell deletable? only false (undeletable) if</span>&nbsp; <span class='diff-add'> * metadata.deletable is explicitly false -- everything else</span>&nbsp; <span class='diff-add'> * counts as true</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method is_deletable</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Cell.prototype.is_deletable = function () {</span>&nbsp; <span class='diff-add'> if (this.metadata.deletable === false) {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @return {String} - the text before the cursor</span>&nbsp; <span class='diff-add'> * @method get_pre_cursor</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Cell.prototype.get_pre_cursor = function () {</span>&nbsp; <span class='diff-add'> var cursor = this.code_mirror.getCursor();</span>&nbsp; <span class='diff-add'> var text = this.code_mirror.getRange({line:0, ch:0}, cursor);</span>&nbsp; <span class='diff-add'> text = text.replace(/^\n+/, '').replace(/\n+$/, '');</span>&nbsp; <span class='diff-add'> return text;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @return {String} - the text after the cursor</span>&nbsp; <span class='diff-add'> * @method get_post_cursor</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Cell.prototype.get_post_cursor = function () {</span>&nbsp; <span class='diff-add'> var cursor = this.code_mirror.getCursor();</span>&nbsp; <span class='diff-add'> var last_line_num = this.code_mirror.lineCount()-1;</span>&nbsp; <span class='diff-add'> var last_line_len = this.code_mirror.getLine(last_line_num).length;</span>&nbsp; <span class='diff-add'> var end = {line:last_line_num, ch:last_line_len};</span>&nbsp; <span class='diff-add'> var text = this.code_mirror.getRange(cursor, end);</span>&nbsp; <span class='diff-add'> text = text.replace(/^\n+/, '').replace(/\n+$/, '');</span>&nbsp; <span class='diff-add'> return text;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Show/Hide CodeMirror LineNumber</span>&nbsp; <span class='diff-add'> * @method show_line_numbers</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param value {Bool} show (true), or hide (false) the line number in CodeMirror</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Cell.prototype.show_line_numbers = function (value) {</span>&nbsp; <span class='diff-add'> this.code_mirror.setOption('lineNumbers', value);</span>&nbsp; <span class='diff-add'> this.code_mirror.refresh();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Toggle CodeMirror LineNumber</span>&nbsp; <span class='diff-add'> * @method toggle_line_numbers</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Cell.prototype.toggle_line_numbers = function () {</span>&nbsp; <span class='diff-add'> var val = this.code_mirror.getOption('lineNumbers');</span>&nbsp; <span class='diff-add'> this.show_line_numbers(!val);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Force codemirror highlight mode</span>&nbsp; <span class='diff-add'> * @method force_highlight</span>&nbsp; <span class='diff-add'> * @param {object} - CodeMirror mode</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Cell.prototype.force_highlight = function(mode) {</span>&nbsp; <span class='diff-add'> this.user_highlight = mode;</span>&nbsp; <span class='diff-add'> this.auto_highlight();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Trigger autodetection of highlight scheme for current cell</span>&nbsp; <span class='diff-add'> * @method auto_highlight</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Cell.prototype.auto_highlight = function () {</span>&nbsp; <span class='diff-add'> this._auto_highlight(this.class_config.get_sync('highlight_modes'));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Try to autodetect cell highlight mode, or use selected mode</span>&nbsp; <span class='diff-add'> * @methods _auto_highlight</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> * @param {String|object|undefined} - CodeMirror mode | 'auto'</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Cell.prototype._auto_highlight = function (modes) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> *Here we handle manually selected modes</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var mode;</span>&nbsp; <span class='diff-add'> if( this.user_highlight !== undefined && this.user_highlight != 'auto' )</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> mode = this.user_highlight;</span>&nbsp; <span class='diff-add'> CodeMirror.autoLoadMode(this.code_mirror, mode);</span>&nbsp; <span class='diff-add'> this.code_mirror.setOption('mode', mode);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var current_mode = this.code_mirror.getOption('mode', mode);</span>&nbsp; <span class='diff-add'> var first_line = this.code_mirror.getLine(0);</span>&nbsp; <span class='diff-add'> // loop on every pairs</span>&nbsp; <span class='diff-add'> for(mode in modes) {</span>&nbsp; <span class='diff-add'> var regs = modes[mode].reg;</span>&nbsp; <span class='diff-add'> // only one key every time but regexp can't be keys...</span>&nbsp; <span class='diff-add'> for(var i=0; i<regs.length; i++) {</span>&nbsp; <span class='diff-add'> // here we handle non magic_modes</span>&nbsp; <span class='diff-add'> if(first_line.match(regs[i]) !== null) {</span>&nbsp; <span class='diff-add'> if(current_mode == mode){</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (mode.search('magic_') !== 0) {</span>&nbsp; <span class='diff-add'> utils.requireCodeMirrorMode(mode, function (spec) {</span>&nbsp; <span class='diff-add'> that.code_mirror.setOption('mode', spec);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var open = modes[mode].open || "%%";</span>&nbsp; <span class='diff-add'> var close = modes[mode].close || "%%end";</span>&nbsp; <span class='diff-add'> var magic_mode = mode;</span>&nbsp; <span class='diff-add'> mode = magic_mode.substr(6);</span>&nbsp; <span class='diff-add'> if(current_mode == magic_mode){</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> utils.requireCodeMirrorMode(mode, function (spec) {</span>&nbsp; <span class='diff-add'> // create on the fly a mode that switch between</span>&nbsp; <span class='diff-add'> // plain/text and something else, otherwise `%%` is</span>&nbsp; <span class='diff-add'> // source of some highlight issues.</span>&nbsp; <span class='diff-add'> CodeMirror.defineMode(magic_mode, function(config) {</span>&nbsp; <span class='diff-add'> return CodeMirror.multiplexingMode(</span>&nbsp; <span class='diff-add'> CodeMirror.getMode(config, 'text/plain'),</span>&nbsp; <span class='diff-add'> // always set something on close</span>&nbsp; <span class='diff-add'> {open: open, close: close,</span>&nbsp; <span class='diff-add'> mode: CodeMirror.getMode(config, spec),</span>&nbsp; <span class='diff-add'> delimStyle: "delimit"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> that.code_mirror.setOption('mode', magic_mode);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // fallback on default</span>&nbsp; <span class='diff-add'> var default_mode;</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> default_mode = this._options.cm_config.mode;</span>&nbsp; <span class='diff-add'> } catch(e) {</span>&nbsp; <span class='diff-add'> default_mode = 'text/plain';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if( current_mode === default_mode){</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.code_mirror.setOption('mode', default_mode);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var UnrecognizedCell = function (options) {</span>&nbsp; <span class='diff-add'> /** Constructor for unrecognized cells */</span>&nbsp; <span class='diff-add'> Cell.apply(this, arguments);</span>&nbsp; <span class='diff-add'> this.cell_type = 'unrecognized';</span>&nbsp; <span class='diff-add'> this.celltoolbar = null;</span>&nbsp; <span class='diff-add'> this.data = {};</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Object.seal(this);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> UnrecognizedCell.prototype = Object.create(Cell.prototype);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // cannot merge or split unrecognized cells</span>&nbsp; <span class='diff-add'> UnrecognizedCell.prototype.is_mergeable = function () {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> UnrecognizedCell.prototype.is_splittable = function () {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> UnrecognizedCell.prototype.toJSON = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * deepcopy the metadata so copied cells don't share the same object</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return JSON.parse(JSON.stringify(this.data));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> UnrecognizedCell.prototype.fromJSON = function (data) {</span>&nbsp; <span class='diff-add'> this.data = data;</span>&nbsp; <span class='diff-add'> if (data.metadata !== undefined) {</span>&nbsp; <span class='diff-add'> this.metadata = data.metadata;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> data.metadata = this.metadata;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.element.find('.inner_cell').find("a").text("Unrecognized cell type: " + data.cell_type);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> UnrecognizedCell.prototype.create_element = function () {</span>&nbsp; <span class='diff-add'> Cell.prototype.create_element.apply(this, arguments);</span>&nbsp; <span class='diff-add'> var cell = this.element = $("<div>").addClass('cell unrecognized_cell');</span>&nbsp; <span class='diff-add'> cell.attr('tabindex','2');</span>&nbsp; <span class='diff-add'> var prompt = $('<div/>').addClass('prompt input_prompt');</span>&nbsp; <span class='diff-add'> cell.append(prompt);</span>&nbsp; <span class='diff-add'> var inner_cell = $('<div/>').addClass('inner_cell');</span>&nbsp; <span class='diff-add'> inner_cell.append(</span>&nbsp; <span class='diff-add'> $("<a>")</span>&nbsp; <span class='diff-add'> .attr("href", "#")</span>&nbsp; <span class='diff-add'> .text("Unrecognized cell type")</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> cell.append(inner_cell);</span>&nbsp; <span class='diff-add'> this.element = cell;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> UnrecognizedCell.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> Cell.prototype.bind_events.apply(this, arguments);</span>&nbsp; <span class='diff-add'> var cell = this;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.element.find('.inner_cell').find("a").click(function () {</span>&nbsp; <span class='diff-add'> cell.events.trigger('unrecognized_cell.Cell', {cell: cell});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatibility.</span>&nbsp; <span class='diff-add'> IPython.Cell = Cell;</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> Cell: Cell,</span>&nbsp; <span class='diff-add'> UnrecognizedCell: UnrecognizedCell</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/celltoolbar.js b/ipynb/Array-feature-overlap-05_files/celltoolbar.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..23c8d20</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/celltoolbar.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/events'</span>&nbsp; <span class='diff-add'>], function(IPython, $, events) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var CellToolbar = function (options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters:</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> * events: $(Events) instance </span>&nbsp; <span class='diff-add'> * cell: Cell instance</span>&nbsp; <span class='diff-add'> * notebook: Notebook instance </span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * TODO: This leaks, when cell are deleted</span>&nbsp; <span class='diff-add'> * There is still a reference to each celltoolbars.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar._instances.push(this);</span>&nbsp; <span class='diff-add'> this.notebook = options.notebook;</span>&nbsp; <span class='diff-add'> this.cell = options.cell;</span>&nbsp; <span class='diff-add'> this.create_element();</span>&nbsp; <span class='diff-add'> this.rebuild();</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CellToolbar.prototype.create_element = function () {</span>&nbsp; <span class='diff-add'> this.inner_element = $('<div/>').addClass('celltoolbar');</span>&nbsp; <span class='diff-add'> this.element = $('<div/>').addClass('ctb_hideshow')</span>&nbsp; <span class='diff-add'> .append(this.inner_element);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // The default css style for the outer celltoolbar div</span>&nbsp; <span class='diff-add'> // (ctb_hideshow) is display: none.</span>&nbsp; <span class='diff-add'> // To show the cell toolbar, *both* of the following conditions must be met:</span>&nbsp; <span class='diff-add'> // - A parent container has class `ctb_global_show`</span>&nbsp; <span class='diff-add'> // - The celltoolbar has the class `ctb_show`</span>&nbsp; <span class='diff-add'> // This allows global show/hide, as well as per-cell show/hide.</span>&nbsp; <span class='diff-add'> CellToolbar.global_hide = function () {</span>&nbsp; <span class='diff-add'> $('body').removeClass('ctb_global_show');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CellToolbar.global_show = function () {</span>&nbsp; <span class='diff-add'> $('body').addClass('ctb_global_show');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CellToolbar.prototype.hide = function () {</span>&nbsp; <span class='diff-add'> this.element.removeClass('ctb_show');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CellToolbar.prototype.show = function () {</span>&nbsp; <span class='diff-add'> this.element.addClass('ctb_show');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Class variable that should contain a dict of all available callback</span>&nbsp; <span class='diff-add'> * we need to think of wether or not we allow nested namespace</span>&nbsp; <span class='diff-add'> * @property _callback_dict</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> * @static</span>&nbsp; <span class='diff-add'> * @type Dict</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar._callback_dict = {};</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Class variable that should contain the reverse order list of the button</span>&nbsp; <span class='diff-add'> * to add to the toolbar of each cell</span>&nbsp; <span class='diff-add'> * @property _ui_controls_list</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> * @static</span>&nbsp; <span class='diff-add'> * @type List</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar._ui_controls_list = [];</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Class variable that should contain the CellToolbar instances for each</span>&nbsp; <span class='diff-add'> * cell of the notebook</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> * @property _instances</span>&nbsp; <span class='diff-add'> * @static</span>&nbsp; <span class='diff-add'> * @type List</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar._instances = [];</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * keep a list of all the available presets for the toolbar</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> * @property _presets</span>&nbsp; <span class='diff-add'> * @static</span>&nbsp; <span class='diff-add'> * @type Dict</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar._presets = {};</span>&nbsp; <span class='diff-add'> // this is by design not a prototype.</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Register a callback to create an UI element in a cell toolbar.</span>&nbsp; <span class='diff-add'> * @method register_callback</span>&nbsp; <span class='diff-add'> * @param name {String} name to use to refer to the callback. It is advised to use a prefix with the name</span>&nbsp; <span class='diff-add'> * for easier sorting and avoid collision</span>&nbsp; <span class='diff-add'> * @param callback {function(div, cell)} callback that will be called to generate the ui element</span>&nbsp; <span class='diff-add'> * @param [cell_types] {List_of_String|undefined} optional list of cell types. If present the UI element</span>&nbsp; <span class='diff-add'> * will be added only to cells of types in the list.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * The callback will receive the following element :</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * * a div in which to add element.</span>&nbsp; <span class='diff-add'> * * the cell it is responsible from</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @example</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Example that create callback for a button that toggle between `true` and `false` label,</span>&nbsp; <span class='diff-add'> * with the metadata under the key 'foo' to reflect the status of the button.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * // first param reference to a DOM div</span>&nbsp; <span class='diff-add'> * // second param reference to the cell.</span>&nbsp; <span class='diff-add'> * var toggle = function(div, cell) {</span>&nbsp; <span class='diff-add'> * var button_container = $(div)</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * // let's create a button that show the current value of the metadata</span>&nbsp; <span class='diff-add'> * var button = $('<div/>').button({label:String(cell.metadata.foo)});</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * // On click, change the metadata value and update the button label</span>&nbsp; <span class='diff-add'> * button.click(function(){</span>&nbsp; <span class='diff-add'> * var v = cell.metadata.foo;</span>&nbsp; <span class='diff-add'> * cell.metadata.foo = !v;</span>&nbsp; <span class='diff-add'> * button.button("option", "label", String(!v));</span>&nbsp; <span class='diff-add'> * })</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * // add the button to the DOM div.</span>&nbsp; <span class='diff-add'> * button_container.append(button);</span>&nbsp; <span class='diff-add'> * }</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * // now we register the callback under the name `foo` to give the</span>&nbsp; <span class='diff-add'> * // user the ability to use it later</span>&nbsp; <span class='diff-add'> * CellToolbar.register_callback('foo', toggle);</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar.register_callback = function(name, callback, cell_types) {</span>&nbsp; <span class='diff-add'> // Overwrite if it already exists.</span>&nbsp; <span class='diff-add'> CellToolbar._callback_dict[name] = cell_types ? {callback: callback, cell_types: cell_types} : callback;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Register a preset of UI element in a cell toolbar.</span>&nbsp; <span class='diff-add'> * Not supported Yet.</span>&nbsp; <span class='diff-add'> * @method register_preset</span>&nbsp; <span class='diff-add'> * @param name {String} name to use to refer to the preset. It is advised to use a prefix with the name</span>&nbsp; <span class='diff-add'> * for easier sorting and avoid collision</span>&nbsp; <span class='diff-add'> * @param preset_list {List_of_String} reverse order of the button in the toolbar. Each String of the list</span>&nbsp; <span class='diff-add'> * should correspond to a name of a registerd callback.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> * @example</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * CellToolbar.register_callback('foo.c1', function(div, cell){...});</span>&nbsp; <span class='diff-add'> * CellToolbar.register_callback('foo.c2', function(div, cell){...});</span>&nbsp; <span class='diff-add'> * CellToolbar.register_callback('foo.c3', function(div, cell){...});</span>&nbsp; <span class='diff-add'> * CellToolbar.register_callback('foo.c4', function(div, cell){...});</span>&nbsp; <span class='diff-add'> * CellToolbar.register_callback('foo.c5', function(div, cell){...});</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * CellToolbar.register_preset('foo.foo_preset1', ['foo.c1', 'foo.c2', 'foo.c5'])</span>&nbsp; <span class='diff-add'> * CellToolbar.register_preset('foo.foo_preset2', ['foo.c4', 'foo.c5'])</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar.register_preset = function(name, preset_list, notebook) {</span>&nbsp; <span class='diff-add'> CellToolbar._presets[name] = preset_list;</span>&nbsp; <span class='diff-add'> events.trigger('preset_added.CellToolbar', {name: name});</span>&nbsp; <span class='diff-add'> // When "register_callback" is called by a custom extension, it may be executed after notebook is loaded.</span>&nbsp; <span class='diff-add'> // In that case, activate the preset if needed.</span>&nbsp; <span class='diff-add'> if (notebook && notebook.metadata && notebook.metadata.celltoolbar === name){</span>&nbsp; <span class='diff-add'> CellToolbar.activate_preset(name);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * unregister the selected preset, </span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * return true if preset successfully unregistered</span>&nbsp; <span class='diff-add'> * false otherwise</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> CellToolbar.unregister_preset = function(name){</span>&nbsp; <span class='diff-add'> if(CellToolbar._presets[name]){</span>&nbsp; <span class='diff-add'> delete CellToolbar._presets[name];</span>&nbsp; <span class='diff-add'> events.trigger('unregistered_preset.CellToolbar', {name: name});</span>&nbsp; <span class='diff-add'> return true</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return false</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * List the names of the presets that are currently registered.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method list_presets</span>&nbsp; <span class='diff-add'> * @static</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar.list_presets = function() {</span>&nbsp; <span class='diff-add'> var keys = [];</span>&nbsp; <span class='diff-add'> for (var k in CellToolbar._presets) {</span>&nbsp; <span class='diff-add'> keys.push(k);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return keys;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Activate an UI preset from `register_preset`</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * This does not update the selection UI.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method activate_preset</span>&nbsp; <span class='diff-add'> * @param preset_name {String} string corresponding to the preset name</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @static</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> * @example</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * CellToolbar.activate_preset('foo.foo_preset1');</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar.activate_preset = function(preset_name){</span>&nbsp; <span class='diff-add'> var preset = CellToolbar._presets[preset_name];</span>&nbsp; <span class='diff-add'> if(preset !== undefined){</span>&nbsp; <span class='diff-add'> CellToolbar._ui_controls_list = preset;</span>&nbsp; <span class='diff-add'> CellToolbar.rebuild_all();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> events.trigger('preset_activated.CellToolbar', {name: preset_name});</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * This should be called on the class and not on a instance as it will trigger</span>&nbsp; <span class='diff-add'> * rebuild of all the instances.</span>&nbsp; <span class='diff-add'> * @method rebuild_all</span>&nbsp; <span class='diff-add'> * @static</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar.rebuild_all = function(){</span>&nbsp; <span class='diff-add'> for(var i=0; i < CellToolbar._instances.length; i++){</span>&nbsp; <span class='diff-add'> CellToolbar._instances[i].rebuild();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Rebuild all the button on the toolbar to update its state.</span>&nbsp; <span class='diff-add'> * @method rebuild</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar.prototype.rebuild = function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * strip evrything from the div</span>&nbsp; <span class='diff-add'> * which is probably inner_element</span>&nbsp; <span class='diff-add'> * or this.element.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.inner_element.empty();</span>&nbsp; <span class='diff-add'> this.ui_controls_list = [];</span>&nbsp; <span class='diff-add'> var callbacks = CellToolbar._callback_dict;</span>&nbsp; <span class='diff-add'> var preset = CellToolbar._ui_controls_list;</span>&nbsp; <span class='diff-add'> // Yes we iterate on the class variable, not the instance one.</span>&nbsp; <span class='diff-add'> for (var i=0; i < preset.length; i++) {</span>&nbsp; <span class='diff-add'> var key = preset[i];</span>&nbsp; <span class='diff-add'> var callback = callbacks[key];</span>&nbsp; <span class='diff-add'> if (!callback) continue;</span>&nbsp; <span class='diff-add'> if (typeof callback === 'object') {</span>&nbsp; <span class='diff-add'> if (callback.cell_types.indexOf(this.cell.cell_type) === -1) continue;</span>&nbsp; <span class='diff-add'> callback = callback.callback;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var local_div = $('<div/>').addClass('button_container');</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> callback(local_div, this.cell, this);</span>&nbsp; <span class='diff-add'> this.ui_controls_list.push(key);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> console.log("Error in cell toolbar callback " + key, e);</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // only append if callback succeeded.</span>&nbsp; <span class='diff-add'> this.inner_element.append(local_div);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // If there are no controls or the cell is a rendered TextCell hide the toolbar.</span>&nbsp; <span class='diff-add'> if (!this.ui_controls_list.length) {</span>&nbsp; <span class='diff-add'> this.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CellToolbar.utils = {};</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * A utility function to generate bindings between a checkbox and cell/metadata</span>&nbsp; <span class='diff-add'> * @method utils.checkbox_ui_generator</span>&nbsp; <span class='diff-add'> * @static</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param name {string} Label in front of the checkbox</span>&nbsp; <span class='diff-add'> * @param setter {function( cell, newValue )}</span>&nbsp; <span class='diff-add'> * A setter method to set the newValue</span>&nbsp; <span class='diff-add'> * @param getter {function( cell )}</span>&nbsp; <span class='diff-add'> * A getter methods which return the current value.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @return callback {function( div, cell )} Callback to be passed to `register_callback`</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @example</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * An exmple that bind the subkey `slideshow.isSectionStart` to a checkbox with a `New Slide` label</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * var newSlide = CellToolbar.utils.checkbox_ui_generator('New Slide',</span>&nbsp; <span class='diff-add'> * // setter</span>&nbsp; <span class='diff-add'> * function(cell, value){</span>&nbsp; <span class='diff-add'> * // we check that the slideshow namespace exist and create it if needed</span>&nbsp; <span class='diff-add'> * if (cell.metadata.slideshow == undefined){cell.metadata.slideshow = {}}</span>&nbsp; <span class='diff-add'> * // set the value</span>&nbsp; <span class='diff-add'> * cell.metadata.slideshow.isSectionStart = value</span>&nbsp; <span class='diff-add'> * },</span>&nbsp; <span class='diff-add'> * //geter</span>&nbsp; <span class='diff-add'> * function(cell){ var ns = cell.metadata.slideshow;</span>&nbsp; <span class='diff-add'> * // if the slideshow namespace does not exist return `undefined`</span>&nbsp; <span class='diff-add'> * // (will be interpreted as `false` by checkbox) otherwise</span>&nbsp; <span class='diff-add'> * // return the value</span>&nbsp; <span class='diff-add'> * return (ns == undefined)? undefined: ns.isSectionStart</span>&nbsp; <span class='diff-add'> * }</span>&nbsp; <span class='diff-add'> * );</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * CellToolbar.register_callback('newSlide', newSlide);</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar.utils.checkbox_ui_generator = function(name, setter, getter){</span>&nbsp; <span class='diff-add'> return function(div, cell, celltoolbar) {</span>&nbsp; <span class='diff-add'> var button_container = $(div);</span>&nbsp; <span class='diff-add'> var chkb = $('<input/>').attr('type', 'checkbox');</span>&nbsp; <span class='diff-add'> var lbl = $('<label/>').append($('<span/>').text(name));</span>&nbsp; <span class='diff-add'> lbl.append(chkb);</span>&nbsp; <span class='diff-add'> chkb.attr("checked", getter(cell));</span>&nbsp; <span class='diff-add'> chkb.click(function(){</span>&nbsp; <span class='diff-add'> var v = getter(cell);</span>&nbsp; <span class='diff-add'> setter(cell, !v);</span>&nbsp; <span class='diff-add'> chkb.attr("checked", !v);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> button_container.append($('<span/>').append(lbl));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * A utility function to generate bindings between a input field and cell/metadata</span>&nbsp; <span class='diff-add'> * @method utils.input_ui_generator</span>&nbsp; <span class='diff-add'> * @static</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param name {string} Label in front of the input field</span>&nbsp; <span class='diff-add'> * @param setter {function( cell, newValue )}</span>&nbsp; <span class='diff-add'> * A setter method to set the newValue</span>&nbsp; <span class='diff-add'> * @param getter {function( cell )}</span>&nbsp; <span class='diff-add'> * A getter methods which return the current value.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @return callback {function( div, cell )} Callback to be passed to `register_callback`</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar.utils.input_ui_generator = function(name, setter, getter){</span>&nbsp; <span class='diff-add'> return function(div, cell, celltoolbar) {</span>&nbsp; <span class='diff-add'> var button_container = $(div);</span>&nbsp; <span class='diff-add'> var text = $('<input/>').attr('type', 'text');</span>&nbsp; <span class='diff-add'> var lbl = $('<label/>').append($('<span/>').text(name));</span>&nbsp; <span class='diff-add'> lbl.append(text);</span>&nbsp; <span class='diff-add'> text.attr("value", getter(cell));</span>&nbsp; <span class='diff-add'> text.keyup(function(){</span>&nbsp; <span class='diff-add'> setter(cell, text.val());</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> button_container.append($('<span/>').append(lbl));</span>&nbsp; <span class='diff-add'> IPython.keyboard_manager.register_events(text);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * A utility function to generate bindings between a dropdown list cell</span>&nbsp; <span class='diff-add'> * @method utils.select_ui_generator</span>&nbsp; <span class='diff-add'> * @static</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param list_list {list_of_sublist} List of sublist of metadata value and name in the dropdown list.</span>&nbsp; <span class='diff-add'> * subslit shoud contain 2 element each, first a string that woul be displayed in the dropdown list,</span>&nbsp; <span class='diff-add'> * and second the corresponding value to be passed to setter/return by getter. the corresponding value </span>&nbsp; <span class='diff-add'> * should not be "undefined" or behavior can be unexpected.</span>&nbsp; <span class='diff-add'> * @param setter {function( cell, newValue )}</span>&nbsp; <span class='diff-add'> * A setter method to set the newValue</span>&nbsp; <span class='diff-add'> * @param getter {function( cell )}</span>&nbsp; <span class='diff-add'> * A getter methods which return the current value of the metadata.</span>&nbsp; <span class='diff-add'> * @param [label=""] {String} optionnal label for the dropdown menu</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @return callback {function( div, cell )} Callback to be passed to `register_callback`</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @example</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * var select_type = CellToolbar.utils.select_ui_generator([</span>&nbsp; <span class='diff-add'> * ["<None>" , "None" ],</span>&nbsp; <span class='diff-add'> * ["Header Slide" , "header_slide" ],</span>&nbsp; <span class='diff-add'> * ["Slide" , "slide" ],</span>&nbsp; <span class='diff-add'> * ["Fragment" , "fragment" ],</span>&nbsp; <span class='diff-add'> * ["Skip" , "skip" ],</span>&nbsp; <span class='diff-add'> * ],</span>&nbsp; <span class='diff-add'> * // setter</span>&nbsp; <span class='diff-add'> * function(cell, value){</span>&nbsp; <span class='diff-add'> * // we check that the slideshow namespace exist and create it if needed</span>&nbsp; <span class='diff-add'> * if (cell.metadata.slideshow == undefined){cell.metadata.slideshow = {}}</span>&nbsp; <span class='diff-add'> * // set the value</span>&nbsp; <span class='diff-add'> * cell.metadata.slideshow.slide_type = value</span>&nbsp; <span class='diff-add'> * },</span>&nbsp; <span class='diff-add'> * //geter</span>&nbsp; <span class='diff-add'> * function(cell){ var ns = cell.metadata.slideshow;</span>&nbsp; <span class='diff-add'> * // if the slideshow namespace does not exist return `undefined`</span>&nbsp; <span class='diff-add'> * // (will be interpreted as `false` by checkbox) otherwise</span>&nbsp; <span class='diff-add'> * // return the value</span>&nbsp; <span class='diff-add'> * return (ns == undefined)? undefined: ns.slide_type</span>&nbsp; <span class='diff-add'> * }</span>&nbsp; <span class='diff-add'> * CellToolbar.register_callback('slideshow.select', select_type);</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CellToolbar.utils.select_ui_generator = function(list_list, setter, getter, label) {</span>&nbsp; <span class='diff-add'> label = label || "";</span>&nbsp; <span class='diff-add'> return function(div, cell, celltoolbar) {</span>&nbsp; <span class='diff-add'> var button_container = $(div);</span>&nbsp; <span class='diff-add'> var lbl = $("<label/>").append($('<span/>').text(label));</span>&nbsp; <span class='diff-add'> var select = $('<select/>');</span>&nbsp; <span class='diff-add'> for(var i=0; i < list_list.length; i++){</span>&nbsp; <span class='diff-add'> var opt = $('<option/>')</span>&nbsp; <span class='diff-add'> .attr('value', list_list[i][1])</span>&nbsp; <span class='diff-add'> .text(list_list[i][0]);</span>&nbsp; <span class='diff-add'> select.append(opt);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> select.val(getter(cell));</span>&nbsp; <span class='diff-add'> select.change(function(){</span>&nbsp; <span class='diff-add'> setter(cell, select.val());</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> button_container.append($('<span/>').append(lbl).append(select));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.CellToolbar = CellToolbar;</span>&nbsp; <span class='diff-add'> return {'CellToolbar': CellToolbar};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/closebrackets.js b/ipynb/Array-feature-overlap-05_files/closebrackets.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..f6b42f0</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/closebrackets.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../../lib/codemirror"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../../lib/codemirror"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'> var DEFAULT_BRACKETS = "()[]{}''\"\"";</span>&nbsp; <span class='diff-add'> var DEFAULT_EXPLODE_ON_ENTER = "[]{}";</span>&nbsp; <span class='diff-add'> var SPACE_CHAR_REGEX = /\s/;</span>&nbsp; <span class='diff-add'> var Pos = CodeMirror.Pos;</span>&nbsp; <span class='diff-add'> CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {</span>&nbsp; <span class='diff-add'> if (old != CodeMirror.Init && old)</span>&nbsp; <span class='diff-add'> cm.removeKeyMap("autoCloseBrackets");</span>&nbsp; <span class='diff-add'> if (!val) return;</span>&nbsp; <span class='diff-add'> var pairs = DEFAULT_BRACKETS, explode = DEFAULT_EXPLODE_ON_ENTER;</span>&nbsp; <span class='diff-add'> if (typeof val == "string") pairs = val;</span>&nbsp; <span class='diff-add'> else if (typeof val == "object") {</span>&nbsp; <span class='diff-add'> if (val.pairs != null) pairs = val.pairs;</span>&nbsp; <span class='diff-add'> if (val.explode != null) explode = val.explode;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var map = buildKeymap(pairs);</span>&nbsp; <span class='diff-add'> if (explode) map.Enter = buildExplodeHandler(explode);</span>&nbsp; <span class='diff-add'> cm.addKeyMap(map);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> function charsAround(cm, pos) {</span>&nbsp; <span class='diff-add'> var str = cm.getRange(Pos(pos.line, pos.ch - 1),</span>&nbsp; <span class='diff-add'> Pos(pos.line, pos.ch + 1));</span>&nbsp; <span class='diff-add'> return str.length == 2 ? str : null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Project the token type that will exists after the given char is</span>&nbsp; <span class='diff-add'> // typed, and use it to determine whether it would cause the start</span>&nbsp; <span class='diff-add'> // of a string token.</span>&nbsp; <span class='diff-add'> function enteringString(cm, pos, ch) {</span>&nbsp; <span class='diff-add'> var line = cm.getLine(pos.line);</span>&nbsp; <span class='diff-add'> var token = cm.getTokenAt(pos);</span>&nbsp; <span class='diff-add'> if (/\bstring2?\b/.test(token.type)) return false;</span>&nbsp; <span class='diff-add'> var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4);</span>&nbsp; <span class='diff-add'> stream.pos = stream.start = token.start;</span>&nbsp; <span class='diff-add'> for (;;) {</span>&nbsp; <span class='diff-add'> var type1 = cm.getMode().token(stream, token.state);</span>&nbsp; <span class='diff-add'> if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1);</span>&nbsp; <span class='diff-add'> stream.start = stream.pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function buildKeymap(pairs) {</span>&nbsp; <span class='diff-add'> var map = {</span>&nbsp; <span class='diff-add'> name : "autoCloseBrackets",</span>&nbsp; <span class='diff-add'> Backspace: function(cm) {</span>&nbsp; <span class='diff-add'> if (cm.getOption("disableInput")) return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> var ranges = cm.listSelections();</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> if (!ranges[i].empty()) return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> var around = charsAround(cm, ranges[i].head);</span>&nbsp; <span class='diff-add'> if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (var i = ranges.length - 1; i >= 0; i--) {</span>&nbsp; <span class='diff-add'> var cur = ranges[i].head;</span>&nbsp; <span class='diff-add'> cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var closingBrackets = "";</span>&nbsp; <span class='diff-add'> for (var i = 0; i < pairs.length; i += 2) (function(left, right) {</span>&nbsp; <span class='diff-add'> closingBrackets += right;</span>&nbsp; <span class='diff-add'> map["'" + left + "'"] = function(cm) {</span>&nbsp; <span class='diff-add'> if (cm.getOption("disableInput")) return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> var ranges = cm.listSelections(), type, next;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var range = ranges[i], cur = range.head, curType;</span>&nbsp; <span class='diff-add'> var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));</span>&nbsp; <span class='diff-add'> if (!range.empty()) {</span>&nbsp; <span class='diff-add'> curType = "surround";</span>&nbsp; <span class='diff-add'> } else if (left == right && next == right) {</span>&nbsp; <span class='diff-add'> if (cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == left + left + left)</span>&nbsp; <span class='diff-add'> curType = "skipThree";</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> curType = "skip";</span>&nbsp; <span class='diff-add'> } else if (left == right && cur.ch > 1 &&</span>&nbsp; <span class='diff-add'> cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left &&</span>&nbsp; <span class='diff-add'> (cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left)) {</span>&nbsp; <span class='diff-add'> curType = "addFour";</span>&nbsp; <span class='diff-add'> } else if (left == '"' || left == "'") {</span>&nbsp; <span class='diff-add'> if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, left)) curType = "both";</span>&nbsp; <span class='diff-add'> else return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> } else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next)) {</span>&nbsp; <span class='diff-add'> curType = "both";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!type) type = curType;</span>&nbsp; <span class='diff-add'> else if (type != curType) return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.operation(function() {</span>&nbsp; <span class='diff-add'> if (type == "skip") {</span>&nbsp; <span class='diff-add'> cm.execCommand("goCharRight");</span>&nbsp; <span class='diff-add'> } else if (type == "skipThree") {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < 3; i++)</span>&nbsp; <span class='diff-add'> cm.execCommand("goCharRight");</span>&nbsp; <span class='diff-add'> } else if (type == "surround") {</span>&nbsp; <span class='diff-add'> var sels = cm.getSelections();</span>&nbsp; <span class='diff-add'> for (var i = 0; i < sels.length; i++)</span>&nbsp; <span class='diff-add'> sels[i] = left + sels[i] + right;</span>&nbsp; <span class='diff-add'> cm.replaceSelections(sels, "around");</span>&nbsp; <span class='diff-add'> } else if (type == "both") {</span>&nbsp; <span class='diff-add'> cm.replaceSelection(left + right, null);</span>&nbsp; <span class='diff-add'> cm.execCommand("goCharLeft");</span>&nbsp; <span class='diff-add'> } else if (type == "addFour") {</span>&nbsp; <span class='diff-add'> cm.replaceSelection(left + left + left + left, "before");</span>&nbsp; <span class='diff-add'> cm.execCommand("goCharRight");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (left != right) map["'" + right + "'"] = function(cm) {</span>&nbsp; <span class='diff-add'> var ranges = cm.listSelections();</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var range = ranges[i];</span>&nbsp; <span class='diff-add'> if (!range.empty() ||</span>&nbsp; <span class='diff-add'> cm.getRange(range.head, Pos(range.head.line, range.head.ch + 1)) != right)</span>&nbsp; <span class='diff-add'> return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.execCommand("goCharRight");</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> })(pairs.charAt(i), pairs.charAt(i + 1));</span>&nbsp; <span class='diff-add'> return map;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function buildExplodeHandler(pairs) {</span>&nbsp; <span class='diff-add'> return function(cm) {</span>&nbsp; <span class='diff-add'> if (cm.getOption("disableInput")) return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> var ranges = cm.listSelections();</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> if (!ranges[i].empty()) return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> var around = charsAround(cm, ranges[i].head);</span>&nbsp; <span class='diff-add'> if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.operation(function() {</span>&nbsp; <span class='diff-add'> cm.replaceSelection("\n\n", null);</span>&nbsp; <span class='diff-add'> cm.execCommand("goCharLeft");</span>&nbsp; <span class='diff-add'> ranges = cm.listSelections();</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var line = ranges[i].head.line;</span>&nbsp; <span class='diff-add'> cm.indentLine(line, null, true);</span>&nbsp; <span class='diff-add'> cm.indentLine(line + 1, null, true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/codecell.js b/ipynb/Array-feature-overlap-05_files/codecell.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..ebc0b62</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/codecell.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @module codecell</span>&nbsp; <span class='diff-add'> * @namespace codecell</span>&nbsp; <span class='diff-add'> * @class CodeCell</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'base/js/keyboard',</span>&nbsp; <span class='diff-add'> 'services/config',</span>&nbsp; <span class='diff-add'> 'notebook/js/cell',</span>&nbsp; <span class='diff-add'> 'notebook/js/outputarea',</span>&nbsp; <span class='diff-add'> 'notebook/js/completer',</span>&nbsp; <span class='diff-add'> 'notebook/js/celltoolbar',</span>&nbsp; <span class='diff-add'> 'codemirror/lib/codemirror',</span>&nbsp; <span class='diff-add'> 'codemirror/mode/python/python',</span>&nbsp; <span class='diff-add'> 'notebook/js/codemirror-ipython'</span>&nbsp; <span class='diff-add'>], function(IPython,</span>&nbsp; <span class='diff-add'> $,</span>&nbsp; <span class='diff-add'> utils,</span>&nbsp; <span class='diff-add'> keyboard,</span>&nbsp; <span class='diff-add'> configmod,</span>&nbsp; <span class='diff-add'> cell,</span>&nbsp; <span class='diff-add'> outputarea,</span>&nbsp; <span class='diff-add'> completer,</span>&nbsp; <span class='diff-add'> celltoolbar,</span>&nbsp; <span class='diff-add'> CodeMirror,</span>&nbsp; <span class='diff-add'> cmpython,</span>&nbsp; <span class='diff-add'> cmip</span>&nbsp; <span class='diff-add'> ) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var Cell = cell.Cell;</span>&nbsp; <span class='diff-add'> /* local util for codemirror */</span>&nbsp; <span class='diff-add'> var posEq = function(a, b) {return a.line === b.line && a.ch === b.ch;};</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * function to delete until previous non blanking space character</span>&nbsp; <span class='diff-add'> * or first multiple of 4 tabstop.</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CodeMirror.commands.delSpaceToPrevTabStop = function(cm){</span>&nbsp; <span class='diff-add'> var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);</span>&nbsp; <span class='diff-add'> if (!posEq(from, to)) { cm.replaceRange("", from, to); return; }</span>&nbsp; <span class='diff-add'> var cur = cm.getCursor(), line = cm.getLine(cur.line);</span>&nbsp; <span class='diff-add'> var tabsize = cm.getOption('tabSize');</span>&nbsp; <span class='diff-add'> var chToPrevTabStop = cur.ch-(Math.ceil(cur.ch/tabsize)-1)*tabsize;</span>&nbsp; <span class='diff-add'> from = {ch:cur.ch-chToPrevTabStop,line:cur.line};</span>&nbsp; <span class='diff-add'> var select = cm.getRange(from,cur);</span>&nbsp; <span class='diff-add'> if( select.match(/^\ +$/) !== null){</span>&nbsp; <span class='diff-add'> cm.replaceRange("",from,cur);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> cm.deleteH(-1,"char");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var keycodes = keyboard.keycodes;</span>&nbsp; <span class='diff-add'> var CodeCell = function (kernel, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * A Cell conceived to write code.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters:</span>&nbsp; <span class='diff-add'> * kernel: Kernel instance</span>&nbsp; <span class='diff-add'> * The kernel doesn't have to be set at creation time, in that case</span>&nbsp; <span class='diff-add'> * it will be null and set_kernel has to be called later.</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> * events: $(Events) instance </span>&nbsp; <span class='diff-add'> * config: dictionary</span>&nbsp; <span class='diff-add'> * keyboard_manager: KeyboardManager instance </span>&nbsp; <span class='diff-add'> * notebook: Notebook instance</span>&nbsp; <span class='diff-add'> * tooltip: Tooltip instance</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.kernel = kernel || null;</span>&nbsp; <span class='diff-add'> this.notebook = options.notebook;</span>&nbsp; <span class='diff-add'> this.collapsed = false;</span>&nbsp; <span class='diff-add'> this.events = options.events;</span>&nbsp; <span class='diff-add'> this.tooltip = options.tooltip;</span>&nbsp; <span class='diff-add'> this.config = options.config;</span>&nbsp; <span class='diff-add'> this.class_config = new configmod.ConfigWithDefaults(this.config,</span>&nbsp; <span class='diff-add'> CodeCell.config_defaults, 'CodeCell');</span>&nbsp; <span class='diff-add'> // create all attributed in constructor function</span>&nbsp; <span class='diff-add'> // even if null for V8 VM optimisation</span>&nbsp; <span class='diff-add'> this.input_prompt_number = null;</span>&nbsp; <span class='diff-add'> this.celltoolbar = null;</span>&nbsp; <span class='diff-add'> this.output_area = null;</span>&nbsp; <span class='diff-add'> this.last_msg_id = null;</span>&nbsp; <span class='diff-add'> this.completer = null;</span>&nbsp; <span class='diff-add'> this.widget_views = [];</span>&nbsp; <span class='diff-add'> this._widgets_live = true;</span>&nbsp; <span class='diff-add'> Cell.apply(this,[{</span>&nbsp; <span class='diff-add'> config: $.extend({}, CodeCell.options_default), </span>&nbsp; <span class='diff-add'> keyboard_manager: options.keyboard_manager, </span>&nbsp; <span class='diff-add'> events: this.events}]);</span>&nbsp; <span class='diff-add'> // Attributes we want to override in this subclass.</span>&nbsp; <span class='diff-add'> this.cell_type = "code";</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.element.focusout(</span>&nbsp; <span class='diff-add'> function() { that.auto_highlight(); }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.options_default = {</span>&nbsp; <span class='diff-add'> cm_config : {</span>&nbsp; <span class='diff-add'> extraKeys: {</span>&nbsp; <span class='diff-add'> "Tab" : "indentMore",</span>&nbsp; <span class='diff-add'> "Shift-Tab" : "indentLess",</span>&nbsp; <span class='diff-add'> "Backspace" : "delSpaceToPrevTabStop",</span>&nbsp; <span class='diff-add'> "Cmd-/" : "toggleComment",</span>&nbsp; <span class='diff-add'> "Ctrl-/" : "toggleComment"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> mode: 'ipython',</span>&nbsp; <span class='diff-add'> theme: 'ipython',</span>&nbsp; <span class='diff-add'> matchBrackets: true</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.config_defaults = {</span>&nbsp; <span class='diff-add'> highlight_modes : {</span>&nbsp; <span class='diff-add'> 'magic_javascript' :{'reg':[/^%%javascript/]},</span>&nbsp; <span class='diff-add'> 'magic_perl' :{'reg':[/^%%perl/]},</span>&nbsp; <span class='diff-add'> 'magic_ruby' :{'reg':[/^%%ruby/]},</span>&nbsp; <span class='diff-add'> 'magic_python' :{'reg':[/^%%python3?/]},</span>&nbsp; <span class='diff-add'> 'magic_shell' :{'reg':[/^%%bash/]},</span>&nbsp; <span class='diff-add'> 'magic_r' :{'reg':[/^%%R/]},</span>&nbsp; <span class='diff-add'> 'magic_text/x-cython' :{'reg':[/^%%cython/]},</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.msg_cells = {};</span>&nbsp; <span class='diff-add'> CodeCell.prototype = Object.create(Cell.prototype);</span>&nbsp; <span class='diff-add'> /** @method create_element */</span>&nbsp; <span class='diff-add'> CodeCell.prototype.create_element = function () {</span>&nbsp; <span class='diff-add'> Cell.prototype.create_element.apply(this, arguments);</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var cell = $('<div></div>').addClass('cell code_cell');</span>&nbsp; <span class='diff-add'> cell.attr('tabindex','2');</span>&nbsp; <span class='diff-add'> var input = $('<div></div>').addClass('input');</span>&nbsp; <span class='diff-add'> var prompt = $('<div/>').addClass('prompt input_prompt');</span>&nbsp; <span class='diff-add'> var inner_cell = $('<div/>').addClass('inner_cell');</span>&nbsp; <span class='diff-add'> this.celltoolbar = new celltoolbar.CellToolbar({</span>&nbsp; <span class='diff-add'> cell: this, </span>&nbsp; <span class='diff-add'> notebook: this.notebook});</span>&nbsp; <span class='diff-add'> inner_cell.append(this.celltoolbar.element);</span>&nbsp; <span class='diff-add'> var input_area = $('<div/>').addClass('input_area');</span>&nbsp; <span class='diff-add'> this.code_mirror = new CodeMirror(input_area.get(0), this.cm_config);</span>&nbsp; <span class='diff-add'> // In case of bugs that put the keyboard manager into an inconsistent state,</span>&nbsp; <span class='diff-add'> // ensure KM is enabled when CodeMirror is focused:</span>&nbsp; <span class='diff-add'> this.code_mirror.on('focus', function () {</span>&nbsp; <span class='diff-add'> if (that.keyboard_manager) {</span>&nbsp; <span class='diff-add'> that.keyboard_manager.enable();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.code_mirror.on('keydown', $.proxy(this.handle_keyevent,this));</span>&nbsp; <span class='diff-add'> $(this.code_mirror.getInputField()).attr("spellcheck", "false");</span>&nbsp; <span class='diff-add'> inner_cell.append(input_area);</span>&nbsp; <span class='diff-add'> input.append(prompt).append(inner_cell);</span>&nbsp; <span class='diff-add'> var widget_area = $('<div/>')</span>&nbsp; <span class='diff-add'> .addClass('widget-area')</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> this.widget_area = widget_area;</span>&nbsp; <span class='diff-add'> var widget_prompt = $('<div/>')</span>&nbsp; <span class='diff-add'> .addClass('prompt')</span>&nbsp; <span class='diff-add'> .appendTo(widget_area);</span>&nbsp; <span class='diff-add'> var widget_subarea = $('<div/>')</span>&nbsp; <span class='diff-add'> .addClass('widget-subarea')</span>&nbsp; <span class='diff-add'> .appendTo(widget_area);</span>&nbsp; <span class='diff-add'> this.widget_subarea = widget_subarea;</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var widget_clear_buton = $('<button />')</span>&nbsp; <span class='diff-add'> .addClass('close')</span>&nbsp; <span class='diff-add'> .html('&times;')</span>&nbsp; <span class='diff-add'> .click(function() {</span>&nbsp; <span class='diff-add'> widget_area.slideUp('', function(){ </span>&nbsp; <span class='diff-add'> for (var i = 0; i < that.widget_views.length; i++) {</span>&nbsp; <span class='diff-add'> var view = that.widget_views[i];</span>&nbsp; <span class='diff-add'> view.remove();</span>&nbsp; <span class='diff-add'> // Remove widget live events.</span>&nbsp; <span class='diff-add'> view.off('comm:live', that._widget_live);</span>&nbsp; <span class='diff-add'> view.off('comm:dead', that._widget_dead);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> that.widget_views = [];</span>&nbsp; <span class='diff-add'> widget_subarea.html(''); </span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> })</span>&nbsp; <span class='diff-add'> .appendTo(widget_prompt);</span>&nbsp; <span class='diff-add'> var output = $('<div></div>');</span>&nbsp; <span class='diff-add'> cell.append(input).append(widget_area).append(output);</span>&nbsp; <span class='diff-add'> this.element = cell;</span>&nbsp; <span class='diff-add'> this.output_area = new outputarea.OutputArea({</span>&nbsp; <span class='diff-add'> selector: output, </span>&nbsp; <span class='diff-add'> prompt_area: true, </span>&nbsp; <span class='diff-add'> events: this.events, </span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager});</span>&nbsp; <span class='diff-add'> this.completer = new completer.Completer(this, this.events);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Display a widget view in the cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CodeCell.prototype.display_widget_view = function(view_promise) {</span>&nbsp; <span class='diff-add'> // Display a dummy element</span>&nbsp; <span class='diff-add'> var dummy = $('<div/>');</span>&nbsp; <span class='diff-add'> this.widget_subarea.append(dummy);</span>&nbsp; <span class='diff-add'> // Display the view.</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return view_promise.then(function(view) {</span>&nbsp; <span class='diff-add'> that.widget_area.show();</span>&nbsp; <span class='diff-add'> dummy.replaceWith(view.$el);</span>&nbsp; <span class='diff-add'> that.widget_views.push(view);</span>&nbsp; <span class='diff-add'> // Check the live state of the view's model.</span>&nbsp; <span class='diff-add'> if (view.model.comm_live) {</span>&nbsp; <span class='diff-add'> that._widget_live(view);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> that._widget_dead(view);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Listen to comm live events for the view.</span>&nbsp; <span class='diff-add'> view.on('comm:live', that._widget_live, that);</span>&nbsp; <span class='diff-add'> view.on('comm:dead', that._widget_dead, that);</span>&nbsp; <span class='diff-add'> return view;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handles when a widget loses it's comm connection.</span>&nbsp; <span class='diff-add'> * @param {WidgetView} view</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CodeCell.prototype._widget_dead = function(view) {</span>&nbsp; <span class='diff-add'> if (this._widgets_live) {</span>&nbsp; <span class='diff-add'> this._widgets_live = false;</span>&nbsp; <span class='diff-add'> this.widget_area.addClass('connection-problems');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handles when a widget is connected to a live comm.</span>&nbsp; <span class='diff-add'> * @param {WidgetView} view</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CodeCell.prototype._widget_live = function(view) {</span>&nbsp; <span class='diff-add'> if (!this._widgets_live) {</span>&nbsp; <span class='diff-add'> // Check that the other widgets are live too. O(N) operation.</span>&nbsp; <span class='diff-add'> // Abort the function at the first dead widget found.</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.widget_views.length; i++) {</span>&nbsp; <span class='diff-add'> if (!this.widget_views[i].model.comm_live) return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._widgets_live = true;</span>&nbsp; <span class='diff-add'> this.widget_area.removeClass('connection-problems');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @method bind_events */</span>&nbsp; <span class='diff-add'> CodeCell.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> Cell.prototype.bind_events.apply(this);</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.element.focusout(</span>&nbsp; <span class='diff-add'> function() { that.auto_highlight(); }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * This method gets called in CodeMirror's onKeyDown/onKeyPress</span>&nbsp; <span class='diff-add'> * handlers and is used to provide custom key handling. Its return</span>&nbsp; <span class='diff-add'> * value is used to determine if CodeMirror should ignore the event:</span>&nbsp; <span class='diff-add'> * true = ignore, false = don't ignore.</span>&nbsp; <span class='diff-add'> * @method handle_codemirror_keyevent</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CodeCell.prototype.handle_codemirror_keyevent = function (editor, event) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> // whatever key is pressed, first, cancel the tooltip request before</span>&nbsp; <span class='diff-add'> // they are sent, and remove tooltip if any, except for tab again</span>&nbsp; <span class='diff-add'> var tooltip_closed = null;</span>&nbsp; <span class='diff-add'> if (event.type === 'keydown' && event.which !== keycodes.tab ) {</span>&nbsp; <span class='diff-add'> tooltip_closed = this.tooltip.remove_and_cancel_tooltip();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var cur = editor.getCursor();</span>&nbsp; <span class='diff-add'> if (event.keyCode === keycodes.enter){</span>&nbsp; <span class='diff-add'> this.auto_highlight();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (event.which === keycodes.down && event.type === 'keypress' && this.tooltip.time_before_tooltip >= 0) {</span>&nbsp; <span class='diff-add'> // triger on keypress (!) otherwise inconsistent event.which depending on plateform</span>&nbsp; <span class='diff-add'> // browser and keyboard layout !</span>&nbsp; <span class='diff-add'> // Pressing '(' , request tooltip, don't forget to reappend it</span>&nbsp; <span class='diff-add'> // The second argument says to hide the tooltip if the docstring</span>&nbsp; <span class='diff-add'> // is actually empty</span>&nbsp; <span class='diff-add'> this.tooltip.pending(that, true);</span>&nbsp; <span class='diff-add'> } else if ( tooltip_closed && event.which === keycodes.esc && event.type === 'keydown') {</span>&nbsp; <span class='diff-add'> // If tooltip is active, cancel it. The call to</span>&nbsp; <span class='diff-add'> // remove_and_cancel_tooltip above doesn't pass, force=true.</span>&nbsp; <span class='diff-add'> // Because of this it won't actually close the tooltip</span>&nbsp; <span class='diff-add'> // if it is in sticky mode. Thus, we have to check again if it is open</span>&nbsp; <span class='diff-add'> // and close it with force=true.</span>&nbsp; <span class='diff-add'> if (!this.tooltip._hidden) {</span>&nbsp; <span class='diff-add'> this.tooltip.remove_and_cancel_tooltip(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // If we closed the tooltip, don't let CM or the global handlers</span>&nbsp; <span class='diff-add'> // handle this event.</span>&nbsp; <span class='diff-add'> event.codemirrorIgnore = true;</span>&nbsp; <span class='diff-add'> event._ipkmIgnore = true;</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else if (event.keyCode === keycodes.tab && event.type === 'keydown' && event.shiftKey) {</span>&nbsp; <span class='diff-add'> if (editor.somethingSelected() || editor.getSelections().length !== 1){</span>&nbsp; <span class='diff-add'> var anchor = editor.getCursor("anchor");</span>&nbsp; <span class='diff-add'> var head = editor.getCursor("head");</span>&nbsp; <span class='diff-add'> if( anchor.line !== head.line){</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var pre_cursor = editor.getRange({line:cur.line,ch:0},cur);</span>&nbsp; <span class='diff-add'> if (pre_cursor.trim() === "") {</span>&nbsp; <span class='diff-add'> // Don't show tooltip if the part of the line before the cursor</span>&nbsp; <span class='diff-add'> // is empty. In this case, let CodeMirror handle indentation.</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> } </span>&nbsp; <span class='diff-add'> this.tooltip.request(that);</span>&nbsp; <span class='diff-add'> event.codemirrorIgnore = true;</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else if (event.keyCode === keycodes.tab && event.type === 'keydown') {</span>&nbsp; <span class='diff-add'> // Tab completion.</span>&nbsp; <span class='diff-add'> this.tooltip.remove_and_cancel_tooltip();</span>&nbsp; <span class='diff-add'> // completion does not work on multicursor, it might be possible though in some cases</span>&nbsp; <span class='diff-add'> if (editor.somethingSelected() || editor.getSelections().length > 1) {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var pre_cursor = editor.getRange({line:cur.line,ch:0},cur);</span>&nbsp; <span class='diff-add'> if (pre_cursor.trim() === "") {</span>&nbsp; <span class='diff-add'> // Don't autocomplete if the part of the line before the cursor</span>&nbsp; <span class='diff-add'> // is empty. In this case, let CodeMirror handle indentation.</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> event.codemirrorIgnore = true;</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> this.completer.startCompletion();</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } </span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // keyboard event wasn't one of those unique to code cells, let's see</span>&nbsp; <span class='diff-add'> // if it's one of the generic ones (i.e. check edit mode shortcuts)</span>&nbsp; <span class='diff-add'> return Cell.prototype.handle_codemirror_keyevent.apply(this, [editor, event]);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Kernel related calls.</span>&nbsp; <span class='diff-add'> CodeCell.prototype.set_kernel = function (kernel) {</span>&nbsp; <span class='diff-add'> this.kernel = kernel;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Execute current code cell to the kernel</span>&nbsp; <span class='diff-add'> * @method execute</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CodeCell.prototype.execute = function (stop_on_error) {</span>&nbsp; <span class='diff-add'> if (!this.kernel || !this.kernel.is_connected()) {</span>&nbsp; <span class='diff-add'> console.log("Can't execute, kernel is not connected.");</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.output_area.clear_output(false, true);</span>&nbsp; <span class='diff-add'> if (stop_on_error === undefined) {</span>&nbsp; <span class='diff-add'> stop_on_error = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Clear widget area</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.widget_views.length; i++) {</span>&nbsp; <span class='diff-add'> var view = this.widget_views[i];</span>&nbsp; <span class='diff-add'> view.remove();</span>&nbsp; <span class='diff-add'> // Remove widget live events.</span>&nbsp; <span class='diff-add'> view.off('comm:live', this._widget_live);</span>&nbsp; <span class='diff-add'> view.off('comm:dead', this._widget_dead);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.widget_views = [];</span>&nbsp; <span class='diff-add'> this.widget_subarea.html('');</span>&nbsp; <span class='diff-add'> this.widget_subarea.height('');</span>&nbsp; <span class='diff-add'> this.widget_area.height('');</span>&nbsp; <span class='diff-add'> this.widget_area.hide();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var old_msg_id = this.last_msg_id;</span>&nbsp; <span class='diff-add'> if (old_msg_id) {</span>&nbsp; <span class='diff-add'> this.kernel.clear_callbacks_for_msg(old_msg_id);</span>&nbsp; <span class='diff-add'> if (old_msg_id) {</span>&nbsp; <span class='diff-add'> delete CodeCell.msg_cells[old_msg_id];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.get_text().trim().length === 0) {</span>&nbsp; <span class='diff-add'> // nothing to do</span>&nbsp; <span class='diff-add'> this.set_input_prompt(null);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.set_input_prompt('*');</span>&nbsp; <span class='diff-add'> this.element.addClass("running");</span>&nbsp; <span class='diff-add'> var callbacks = this.get_callbacks();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.last_msg_id = this.kernel.execute(this.get_text(), callbacks, {silent: false, store_history: true,</span>&nbsp; <span class='diff-add'> stop_on_error : stop_on_error});</span>&nbsp; <span class='diff-add'> CodeCell.msg_cells[this.last_msg_id] = this;</span>&nbsp; <span class='diff-add'> this.render();</span>&nbsp; <span class='diff-add'> this.events.trigger('execute.CodeCell', {cell: this});</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Construct the default callbacks for</span>&nbsp; <span class='diff-add'> * @method get_callbacks</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CodeCell.prototype.get_callbacks = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> shell : {</span>&nbsp; <span class='diff-add'> reply : $.proxy(this._handle_execute_reply, this),</span>&nbsp; <span class='diff-add'> payload : {</span>&nbsp; <span class='diff-add'> set_next_input : $.proxy(this._handle_set_next_input, this),</span>&nbsp; <span class='diff-add'> page : $.proxy(this._open_with_pager, this)</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> iopub : {</span>&nbsp; <span class='diff-add'> output : function() { </span>&nbsp; <span class='diff-add'> that.output_area.handle_output.apply(that.output_area, arguments);</span>&nbsp; <span class='diff-add'> }, </span>&nbsp; <span class='diff-add'> clear_output : function() { </span>&nbsp; <span class='diff-add'> that.output_area.handle_clear_output.apply(that.output_area, arguments);</span>&nbsp; <span class='diff-add'> }, </span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> input : $.proxy(this._handle_input_request, this)</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CodeCell.prototype._open_with_pager = function (payload) {</span>&nbsp; <span class='diff-add'> this.events.trigger('open_with_text.Pager', payload);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @method _handle_execute_reply</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CodeCell.prototype._handle_execute_reply = function (msg) {</span>&nbsp; <span class='diff-add'> this.set_input_prompt(msg.content.execution_count);</span>&nbsp; <span class='diff-add'> this.element.removeClass("running");</span>&nbsp; <span class='diff-add'> this.events.trigger('set_dirty.Notebook', {value: true});</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @method _handle_set_next_input</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CodeCell.prototype._handle_set_next_input = function (payload) {</span>&nbsp; <span class='diff-add'> var data = {'cell': this, 'text': payload.text, replace: payload.replace};</span>&nbsp; <span class='diff-add'> this.events.trigger('set_next_input.Notebook', data);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @method _handle_input_request</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CodeCell.prototype._handle_input_request = function (msg) {</span>&nbsp; <span class='diff-add'> this.output_area.append_raw_input(msg);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Basic cell manipulation.</span>&nbsp; <span class='diff-add'> CodeCell.prototype.select = function () {</span>&nbsp; <span class='diff-add'> var cont = Cell.prototype.select.apply(this);</span>&nbsp; <span class='diff-add'> if (cont) {</span>&nbsp; <span class='diff-add'> this.code_mirror.refresh();</span>&nbsp; <span class='diff-add'> this.auto_highlight();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cont;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.prototype.render = function () {</span>&nbsp; <span class='diff-add'> var cont = Cell.prototype.render.apply(this);</span>&nbsp; <span class='diff-add'> // Always execute, even if we are already in the rendered state</span>&nbsp; <span class='diff-add'> return cont;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CodeCell.prototype.select_all = function () {</span>&nbsp; <span class='diff-add'> var start = {line: 0, ch: 0};</span>&nbsp; <span class='diff-add'> var nlines = this.code_mirror.lineCount();</span>&nbsp; <span class='diff-add'> var last_line = this.code_mirror.getLine(nlines-1);</span>&nbsp; <span class='diff-add'> var end = {line: nlines-1, ch: last_line.length};</span>&nbsp; <span class='diff-add'> this.code_mirror.setSelection(start, end);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.prototype.collapse_output = function () {</span>&nbsp; <span class='diff-add'> this.output_area.collapse();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.prototype.expand_output = function () {</span>&nbsp; <span class='diff-add'> this.output_area.expand();</span>&nbsp; <span class='diff-add'> this.output_area.unscroll_area();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.prototype.scroll_output = function () {</span>&nbsp; <span class='diff-add'> this.output_area.expand();</span>&nbsp; <span class='diff-add'> this.output_area.scroll_if_long();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.prototype.toggle_output = function () {</span>&nbsp; <span class='diff-add'> this.output_area.toggle_output();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.prototype.toggle_output_scroll = function () {</span>&nbsp; <span class='diff-add'> this.output_area.toggle_scroll();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.input_prompt_classical = function (prompt_value, lines_number) {</span>&nbsp; <span class='diff-add'> var ns;</span>&nbsp; <span class='diff-add'> if (prompt_value === undefined || prompt_value === null) {</span>&nbsp; <span class='diff-add'> ns = "&nbsp;";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> ns = encodeURIComponent(prompt_value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return 'In&nbsp;[' + ns + ']:';</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.input_prompt_continuation = function (prompt_value, lines_number) {</span>&nbsp; <span class='diff-add'> var html = [CodeCell.input_prompt_classical(prompt_value, lines_number)];</span>&nbsp; <span class='diff-add'> for(var i=1; i < lines_number; i++) {</span>&nbsp; <span class='diff-add'> html.push(['...:']);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return html.join('<br/>');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.input_prompt_function = CodeCell.input_prompt_classical;</span>&nbsp; <span class='diff-add'> CodeCell.prototype.set_input_prompt = function (number) {</span>&nbsp; <span class='diff-add'> var nline = 1;</span>&nbsp; <span class='diff-add'> if (this.code_mirror !== undefined) {</span>&nbsp; <span class='diff-add'> nline = this.code_mirror.lineCount();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.input_prompt_number = number;</span>&nbsp; <span class='diff-add'> var prompt_html = CodeCell.input_prompt_function(this.input_prompt_number, nline);</span>&nbsp; <span class='diff-add'> // This HTML call is okay because the user contents are escaped.</span>&nbsp; <span class='diff-add'> this.element.find('div.input_prompt').html(prompt_html);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.prototype.clear_input = function () {</span>&nbsp; <span class='diff-add'> this.code_mirror.setValue('');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.prototype.get_text = function () {</span>&nbsp; <span class='diff-add'> return this.code_mirror.getValue();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.prototype.set_text = function (code) {</span>&nbsp; <span class='diff-add'> return this.code_mirror.setValue(code);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.prototype.clear_output = function (wait) {</span>&nbsp; <span class='diff-add'> this.output_area.clear_output(wait);</span>&nbsp; <span class='diff-add'> this.set_input_prompt();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // JSON serialization</span>&nbsp; <span class='diff-add'> CodeCell.prototype.fromJSON = function (data) {</span>&nbsp; <span class='diff-add'> Cell.prototype.fromJSON.apply(this, arguments);</span>&nbsp; <span class='diff-add'> if (data.cell_type === 'code') {</span>&nbsp; <span class='diff-add'> if (data.source !== undefined) {</span>&nbsp; <span class='diff-add'> this.set_text(data.source);</span>&nbsp; <span class='diff-add'> // make this value the starting point, so that we can only undo</span>&nbsp; <span class='diff-add'> // to this state, instead of a blank cell</span>&nbsp; <span class='diff-add'> this.code_mirror.clearHistory();</span>&nbsp; <span class='diff-add'> this.auto_highlight();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.set_input_prompt(data.execution_count);</span>&nbsp; <span class='diff-add'> this.output_area.trusted = data.metadata.trusted || false;</span>&nbsp; <span class='diff-add'> this.output_area.fromJSON(data.outputs, data.metadata);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeCell.prototype.toJSON = function () {</span>&nbsp; <span class='diff-add'> var data = Cell.prototype.toJSON.apply(this);</span>&nbsp; <span class='diff-add'> data.source = this.get_text();</span>&nbsp; <span class='diff-add'> // is finite protect against undefined and '*' value</span>&nbsp; <span class='diff-add'> if (isFinite(this.input_prompt_number)) {</span>&nbsp; <span class='diff-add'> data.execution_count = this.input_prompt_number;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> data.execution_count = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var outputs = this.output_area.toJSON();</span>&nbsp; <span class='diff-add'> data.outputs = outputs;</span>&nbsp; <span class='diff-add'> data.metadata.trusted = this.output_area.trusted;</span>&nbsp; <span class='diff-add'> data.metadata.collapsed = this.output_area.collapsed;</span>&nbsp; <span class='diff-add'> if (this.output_area.scroll_state === 'auto') {</span>&nbsp; <span class='diff-add'> delete data.metadata.scrolled;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> data.metadata.scrolled = this.output_area.scroll_state;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return data;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * handle cell level logic when a cell is unselected</span>&nbsp; <span class='diff-add'> * @method unselect</span>&nbsp; <span class='diff-add'> * @return is the action being taken</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> CodeCell.prototype.unselect = function () {</span>&nbsp; <span class='diff-add'> var cont = Cell.prototype.unselect.apply(this);</span>&nbsp; <span class='diff-add'> if (cont) {</span>&nbsp; <span class='diff-add'> // When a code cell is usnelected, make sure that the corresponding</span>&nbsp; <span class='diff-add'> // tooltip and completer to that cell is closed.</span>&nbsp; <span class='diff-add'> this.tooltip.remove_and_cancel_tooltip(true);</span>&nbsp; <span class='diff-add'> if (this.completer !== null) {</span>&nbsp; <span class='diff-add'> this.completer.close();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cont;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.CodeCell = CodeCell;</span>&nbsp; <span class='diff-add'> return {'CodeCell': CodeCell};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/codemirror-ipython.js b/ipynb/Array-feature-overlap-05_files/codemirror-ipython.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..b58229a</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/codemirror-ipython.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// IPython mode is just a slightly altered Python Mode with `?` beeing a extra</span>&nbsp; <span class='diff-add'>// single operator. Here we define `ipython` mode in the require `python`</span>&nbsp; <span class='diff-add'>// callback to auto-load python mode, which is more likely not the best things</span>&nbsp; <span class='diff-add'>// to do, but at least the simple one for now.</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object"){ // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("codemirror/lib/codemirror"),</span>&nbsp; <span class='diff-add'> require("codemirror/mode/python/python")</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> } else if (typeof define == "function" && define.amd){ // AMD</span>&nbsp; <span class='diff-add'> define(["codemirror/lib/codemirror",</span>&nbsp; <span class='diff-add'> "codemirror/mode/python/python"], mod);</span>&nbsp; <span class='diff-add'> } else {// Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> CodeMirror.defineMode("ipython", function(conf, parserConf) {</span>&nbsp; <span class='diff-add'> var pythonConf = {};</span>&nbsp; <span class='diff-add'> for (var prop in parserConf) {</span>&nbsp; <span class='diff-add'> if (parserConf.hasOwnProperty(prop)) {</span>&nbsp; <span class='diff-add'> pythonConf[prop] = parserConf[prop];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> pythonConf.name = 'python';</span>&nbsp; <span class='diff-add'> pythonConf.singleOperators = new RegExp("^[\\+\\-\\*/%&|\\^~<>!\\?]");</span>&nbsp; <span class='diff-add'> if (pythonConf.version === 3) {</span>&nbsp; <span class='diff-add'> pythonConf.identifiers = new RegExp("^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*");</span>&nbsp; <span class='diff-add'> } else if (pythonConf.version === 2) {</span>&nbsp; <span class='diff-add'> pythonConf.identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return CodeMirror.getMode(conf, pythonConf);</span>&nbsp; <span class='diff-add'> }, 'python');</span>&nbsp; <span class='diff-add'> CodeMirror.defineMIME("text/x-ipython", "ipython");</span>&nbsp; <span class='diff-add'>})</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/codemirror-ipythongfm.js b/ipynb/Array-feature-overlap-05_files/codemirror-ipythongfm.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..9a6bbc3</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/codemirror-ipythongfm.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// IPython GFM (GitHub Flavored Markdown) mode is just a slightly altered GFM</span>&nbsp; <span class='diff-add'>// Mode with support for latex.</span>&nbsp; <span class='diff-add'>//</span>&nbsp; <span class='diff-add'>// Latex support was supported by Codemirror GFM as of</span>&nbsp; <span class='diff-add'>// https://github.com/codemirror/CodeMirror/pull/567</span>&nbsp; <span class='diff-add'>// But was later removed in</span>&nbsp; <span class='diff-add'>// https://github.com/codemirror/CodeMirror/commit/d9c9f1b1ffe984aee41307f3e927f80d1f23590c</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object"){ // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("codemirror/lib/codemirror")</span>&nbsp; <span class='diff-add'> ,require("codemirror/addon/mode/multiplex")</span>&nbsp; <span class='diff-add'> ,require("codemirror/mode/gfm/gfm")</span>&nbsp; <span class='diff-add'> ,require("codemirror/mode/stex/stex")</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> } else if (typeof define == "function" && define.amd){ // AMD</span>&nbsp; <span class='diff-add'> define(["codemirror/lib/codemirror"</span>&nbsp; <span class='diff-add'> ,"codemirror/addon/mode/multiplex"</span>&nbsp; <span class='diff-add'> ,"codemirror/mode/python/python"</span>&nbsp; <span class='diff-add'> ,"codemirror/mode/stex/stex"</span>&nbsp; <span class='diff-add'> ], mod);</span>&nbsp; <span class='diff-add'> } else {// Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'>})( function(CodeMirror){</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> CodeMirror.defineMode("ipythongfm", function(config, parserConfig) {</span>&nbsp; <span class='diff-add'> var gfm_mode = CodeMirror.getMode(config, "gfm");</span>&nbsp; <span class='diff-add'> var tex_mode = CodeMirror.getMode(config, "stex");</span>&nbsp; <span class='diff-add'> return CodeMirror.multiplexingMode(</span>&nbsp; <span class='diff-add'> gfm_mode,</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> open: "$", close: "$",</span>&nbsp; <span class='diff-add'> mode: tex_mode,</span>&nbsp; <span class='diff-add'> delimStyle: "delimit"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> // not sure this works as $$ is interpreted at (opening $, closing $, as defined just above)</span>&nbsp; <span class='diff-add'> open: "$$", close: "$$",</span>&nbsp; <span class='diff-add'> mode: tex_mode,</span>&nbsp; <span class='diff-add'> delimStyle: "delimit"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> open: "\\(", close: "\\)",</span>&nbsp; <span class='diff-add'> mode: tex_mode,</span>&nbsp; <span class='diff-add'> delimStyle: "delimit"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> open: "\\[", close: "\\]",</span>&nbsp; <span class='diff-add'> mode: tex_mode,</span>&nbsp; <span class='diff-add'> delimStyle: "delimit"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // .. more multiplexed styles can follow here</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> }, 'gfm');</span>&nbsp; <span class='diff-add'> CodeMirror.defineMIME("text/x-ipythongfm", "ipythongfm");</span>&nbsp; <span class='diff-add'>})</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/codemirror.js b/ipynb/Array-feature-overlap-05_files/codemirror.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..038a894</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/codemirror.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>// This is CodeMirror (http://codemirror.net), a code editor</span>&nbsp; <span class='diff-add'>// implemented in JavaScript on top of the browser's DOM.</span>&nbsp; <span class='diff-add'>//</span>&nbsp; <span class='diff-add'>// You can find some technical background for some of the code below</span>&nbsp; <span class='diff-add'>// at http://marijnhaverbeke.nl/blog/#cm-internals .</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> module.exports = mod();</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> return define([], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> this.CodeMirror = mod();</span>&nbsp; <span class='diff-add'>})(function() {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> // BROWSER SNIFFING</span>&nbsp; <span class='diff-add'> // Kludges for bugs and behavior differences that can't be feature</span>&nbsp; <span class='diff-add'> // detected are enabled based on userAgent etc sniffing.</span>&nbsp; <span class='diff-add'> var gecko = /gecko\/\d/i.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> // ie_uptoN means Internet Explorer version N or lower</span>&nbsp; <span class='diff-add'> var ie_upto10 = /MSIE \d/.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);</span>&nbsp; <span class='diff-add'> var ie = ie_upto10 || ie_11up;</span>&nbsp; <span class='diff-add'> var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]);</span>&nbsp; <span class='diff-add'> var webkit = /WebKit\//.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> var chrome = /Chrome\//.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> var presto = /Opera\//.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> var safari = /Apple Computer/.test(navigator.vendor);</span>&nbsp; <span class='diff-add'> var khtml = /KHTML\//.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> var phantom = /PhantomJS/.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> // This is woefully incomplete. Suggestions for alternative methods welcome.</span>&nbsp; <span class='diff-add'> var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> var mac = ios || /Mac/.test(navigator.platform);</span>&nbsp; <span class='diff-add'> var windows = /win/i.test(navigator.platform);</span>&nbsp; <span class='diff-add'> var presto_version = presto && navigator.userAgent.match(/Version\/(\d*\.\d*)/);</span>&nbsp; <span class='diff-add'> if (presto_version) presto_version = Number(presto_version[1]);</span>&nbsp; <span class='diff-add'> if (presto_version && presto_version >= 15) { presto = false; webkit = true; }</span>&nbsp; <span class='diff-add'> // Some browsers use the wrong event properties to signal cmd/ctrl on OS X</span>&nbsp; <span class='diff-add'> var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));</span>&nbsp; <span class='diff-add'> var captureRightClick = gecko || (ie && ie_version >= 9);</span>&nbsp; <span class='diff-add'> // Optimize some code when these features are not used.</span>&nbsp; <span class='diff-add'> var sawReadOnlySpans = false, sawCollapsedSpans = false;</span>&nbsp; <span class='diff-add'> // EDITOR CONSTRUCTOR</span>&nbsp; <span class='diff-add'> // A CodeMirror instance represents an editor. This is the object</span>&nbsp; <span class='diff-add'> // that user code is usually dealing with.</span>&nbsp; <span class='diff-add'> function CodeMirror(place, options) {</span>&nbsp; <span class='diff-add'> if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);</span>&nbsp; <span class='diff-add'> this.options = options = options ? copyObj(options) : {};</span>&nbsp; <span class='diff-add'> // Determine effective options based on given values and defaults.</span>&nbsp; <span class='diff-add'> copyObj(defaults, options, false);</span>&nbsp; <span class='diff-add'> setGuttersForLineNumbers(options);</span>&nbsp; <span class='diff-add'> var doc = options.value;</span>&nbsp; <span class='diff-add'> if (typeof doc == "string") doc = new Doc(doc, options.mode);</span>&nbsp; <span class='diff-add'> this.doc = doc;</span>&nbsp; <span class='diff-add'> var display = this.display = new Display(place, doc);</span>&nbsp; <span class='diff-add'> display.wrapper.CodeMirror = this;</span>&nbsp; <span class='diff-add'> updateGutters(this);</span>&nbsp; <span class='diff-add'> themeChanged(this);</span>&nbsp; <span class='diff-add'> if (options.lineWrapping)</span>&nbsp; <span class='diff-add'> this.display.wrapper.className += " CodeMirror-wrap";</span>&nbsp; <span class='diff-add'> if (options.autofocus && !mobile) focusInput(this);</span>&nbsp; <span class='diff-add'> initScrollbars(this);</span>&nbsp; <span class='diff-add'> this.state = {</span>&nbsp; <span class='diff-add'> keyMaps: [], // stores maps added by addKeyMap</span>&nbsp; <span class='diff-add'> overlays: [], // highlighting overlays, as added by addOverlay</span>&nbsp; <span class='diff-add'> modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info</span>&nbsp; <span class='diff-add'> overwrite: false, focused: false,</span>&nbsp; <span class='diff-add'> suppressEdits: false, // used to disable editing during key handlers when in readOnly mode</span>&nbsp; <span class='diff-add'> pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in readInput</span>&nbsp; <span class='diff-add'> draggingText: false,</span>&nbsp; <span class='diff-add'> highlight: new Delayed(), // stores highlight worker timeout</span>&nbsp; <span class='diff-add'> keySeq: null // Unfinished key sequence</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Override magic textarea content restore that IE sometimes does</span>&nbsp; <span class='diff-add'> // on our hidden textarea on reload</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 11) setTimeout(bind(resetInput, this, true), 20);</span>&nbsp; <span class='diff-add'> registerEventHandlers(this);</span>&nbsp; <span class='diff-add'> ensureGlobalHandlers();</span>&nbsp; <span class='diff-add'> startOperation(this);</span>&nbsp; <span class='diff-add'> this.curOp.forceUpdate = true;</span>&nbsp; <span class='diff-add'> attachDoc(this, doc);</span>&nbsp; <span class='diff-add'> if ((options.autofocus && !mobile) || activeElt() == display.input)</span>&nbsp; <span class='diff-add'> setTimeout(bind(onFocus, this), 20);</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> onBlur(this);</span>&nbsp; <span class='diff-add'> for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))</span>&nbsp; <span class='diff-add'> optionHandlers[opt](this, options[opt], Init);</span>&nbsp; <span class='diff-add'> maybeUpdateLineNumberWidth(this);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);</span>&nbsp; <span class='diff-add'> endOperation(this);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // DISPLAY CONSTRUCTOR</span>&nbsp; <span class='diff-add'> // The display handles the DOM integration, both for input reading</span>&nbsp; <span class='diff-add'> // and content drawing. It holds references to DOM nodes and</span>&nbsp; <span class='diff-add'> // display-related state.</span>&nbsp; <span class='diff-add'> function Display(place, doc) {</span>&nbsp; <span class='diff-add'> var d = this;</span>&nbsp; <span class='diff-add'> // The semihidden textarea that is focused when the editor is</span>&nbsp; <span class='diff-add'> // focused, and receives input.</span>&nbsp; <span class='diff-add'> var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none");</span>&nbsp; <span class='diff-add'> // The textarea is kept positioned near the cursor to prevent the</span>&nbsp; <span class='diff-add'> // fact that it'll be scrolled into view on input from scrolling</span>&nbsp; <span class='diff-add'> // our fake cursor out of view. On webkit, when wrap=off, paste is</span>&nbsp; <span class='diff-add'> // very slow. So make the area wide instead.</span>&nbsp; <span class='diff-add'> if (webkit) input.style.width = "1000px";</span>&nbsp; <span class='diff-add'> else input.setAttribute("wrap", "off");</span>&nbsp; <span class='diff-add'> // If border: 0; -- iOS fails to open keyboard (issue #1287)</span>&nbsp; <span class='diff-add'> if (ios) input.style.border = "1px solid black";</span>&nbsp; <span class='diff-add'> input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); input.setAttribute("spellcheck", "false");</span>&nbsp; <span class='diff-add'> // Wraps and hides input textarea</span>&nbsp; <span class='diff-add'> d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");</span>&nbsp; <span class='diff-add'> // Covers bottom-right square when both scrollbars are present.</span>&nbsp; <span class='diff-add'> d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");</span>&nbsp; <span class='diff-add'> d.scrollbarFiller.setAttribute("not-content", "true");</span>&nbsp; <span class='diff-add'> // Covers bottom of gutter when coverGutterNextToScrollbar is on</span>&nbsp; <span class='diff-add'> // and h scrollbar is present.</span>&nbsp; <span class='diff-add'> d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");</span>&nbsp; <span class='diff-add'> d.gutterFiller.setAttribute("not-content", "true");</span>&nbsp; <span class='diff-add'> // Will contain the actual code, positioned to cover the viewport.</span>&nbsp; <span class='diff-add'> d.lineDiv = elt("div", null, "CodeMirror-code");</span>&nbsp; <span class='diff-add'> // Elements are added to these to represent selection and cursors.</span>&nbsp; <span class='diff-add'> d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");</span>&nbsp; <span class='diff-add'> d.cursorDiv = elt("div", null, "CodeMirror-cursors");</span>&nbsp; <span class='diff-add'> // A visibility: hidden element used to find the size of things.</span>&nbsp; <span class='diff-add'> d.measure = elt("div", null, "CodeMirror-measure");</span>&nbsp; <span class='diff-add'> // When lines outside of the viewport are measured, they are drawn in this.</span>&nbsp; <span class='diff-add'> d.lineMeasure = elt("div", null, "CodeMirror-measure");</span>&nbsp; <span class='diff-add'> // Wraps everything that needs to exist inside the vertically-padded coordinate system</span>&nbsp; <span class='diff-add'> d.lineSpace = elt("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],</span>&nbsp; <span class='diff-add'> null, "position: relative; outline: none");</span>&nbsp; <span class='diff-add'> // Moved around its parent to cover visible view.</span>&nbsp; <span class='diff-add'> d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");</span>&nbsp; <span class='diff-add'> // Set to the height of the document, allowing scrolling.</span>&nbsp; <span class='diff-add'> d.sizer = elt("div", [d.mover], "CodeMirror-sizer");</span>&nbsp; <span class='diff-add'> d.sizerWidth = null;</span>&nbsp; <span class='diff-add'> // Behavior of elts with overflow: auto and padding is</span>&nbsp; <span class='diff-add'> // inconsistent across browsers. This is used to ensure the</span>&nbsp; <span class='diff-add'> // scrollable area is big enough.</span>&nbsp; <span class='diff-add'> d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;");</span>&nbsp; <span class='diff-add'> // Will contain the gutters, if any.</span>&nbsp; <span class='diff-add'> d.gutters = elt("div", null, "CodeMirror-gutters");</span>&nbsp; <span class='diff-add'> d.lineGutter = null;</span>&nbsp; <span class='diff-add'> // Actual scrollable element.</span>&nbsp; <span class='diff-add'> d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");</span>&nbsp; <span class='diff-add'> d.scroller.setAttribute("tabIndex", "-1");</span>&nbsp; <span class='diff-add'> // The element in which the editor lives.</span>&nbsp; <span class='diff-add'> d.wrapper = elt("div", [d.inputDiv, d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");</span>&nbsp; <span class='diff-add'> // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }</span>&nbsp; <span class='diff-add'> // Needed to hide big blue blinking cursor on Mobile Safari</span>&nbsp; <span class='diff-add'> if (ios) input.style.width = "0px";</span>&nbsp; <span class='diff-add'> if (!webkit) d.scroller.draggable = true;</span>&nbsp; <span class='diff-add'> // Needed to handle Tab key in KHTML</span>&nbsp; <span class='diff-add'> if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; }</span>&nbsp; <span class='diff-add'> if (place) {</span>&nbsp; <span class='diff-add'> if (place.appendChild) place.appendChild(d.wrapper);</span>&nbsp; <span class='diff-add'> else place(d.wrapper);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Current rendered range (may be bigger than the view window).</span>&nbsp; <span class='diff-add'> d.viewFrom = d.viewTo = doc.first;</span>&nbsp; <span class='diff-add'> d.reportedViewFrom = d.reportedViewTo = doc.first;</span>&nbsp; <span class='diff-add'> // Information about the rendered lines.</span>&nbsp; <span class='diff-add'> d.view = [];</span>&nbsp; <span class='diff-add'> d.renderedView = null;</span>&nbsp; <span class='diff-add'> // Holds info about a single rendered line when it was rendered</span>&nbsp; <span class='diff-add'> // for measurement, while not in view.</span>&nbsp; <span class='diff-add'> d.externalMeasured = null;</span>&nbsp; <span class='diff-add'> // Empty space (in pixels) above the view</span>&nbsp; <span class='diff-add'> d.viewOffset = 0;</span>&nbsp; <span class='diff-add'> d.lastWrapHeight = d.lastWrapWidth = 0;</span>&nbsp; <span class='diff-add'> d.updateLineNumbers = null;</span>&nbsp; <span class='diff-add'> d.nativeBarWidth = d.barHeight = d.barWidth = 0;</span>&nbsp; <span class='diff-add'> d.scrollbarsClipped = false;</span>&nbsp; <span class='diff-add'> // Used to only resize the line number gutter when necessary (when</span>&nbsp; <span class='diff-add'> // the amount of lines crosses a boundary that makes its width change)</span>&nbsp; <span class='diff-add'> d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;</span>&nbsp; <span class='diff-add'> // See readInput and resetInput</span>&nbsp; <span class='diff-add'> d.prevInput = "";</span>&nbsp; <span class='diff-add'> // Set to true when a non-horizontal-scrolling line widget is</span>&nbsp; <span class='diff-add'> // added. As an optimization, line widget aligning is skipped when</span>&nbsp; <span class='diff-add'> // this is false.</span>&nbsp; <span class='diff-add'> d.alignWidgets = false;</span>&nbsp; <span class='diff-add'> // Flag that indicates whether we expect input to appear real soon</span>&nbsp; <span class='diff-add'> // now (after some event like 'keypress' or 'input') and are</span>&nbsp; <span class='diff-add'> // polling intensively.</span>&nbsp; <span class='diff-add'> d.pollingFast = false;</span>&nbsp; <span class='diff-add'> // Self-resetting timeout for the poller</span>&nbsp; <span class='diff-add'> d.poll = new Delayed();</span>&nbsp; <span class='diff-add'> d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;</span>&nbsp; <span class='diff-add'> // Tracks when resetInput has punted to just putting a short</span>&nbsp; <span class='diff-add'> // string into the textarea instead of the full selection.</span>&nbsp; <span class='diff-add'> d.inaccurateSelection = false;</span>&nbsp; <span class='diff-add'> // Tracks the maximum line length so that the horizontal scrollbar</span>&nbsp; <span class='diff-add'> // can be kept static when scrolling.</span>&nbsp; <span class='diff-add'> d.maxLine = null;</span>&nbsp; <span class='diff-add'> d.maxLineLength = 0;</span>&nbsp; <span class='diff-add'> d.maxLineChanged = false;</span>&nbsp; <span class='diff-add'> // Used for measuring wheel scrolling granularity</span>&nbsp; <span class='diff-add'> d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;</span>&nbsp; <span class='diff-add'> // True when shift is held down.</span>&nbsp; <span class='diff-add'> d.shift = false;</span>&nbsp; <span class='diff-add'> // Used to track whether anything happened since the context menu</span>&nbsp; <span class='diff-add'> // was opened.</span>&nbsp; <span class='diff-add'> d.selForContextMenu = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // STATE UPDATES</span>&nbsp; <span class='diff-add'> // Used to get the editor into a consistent state again when options change.</span>&nbsp; <span class='diff-add'> function loadMode(cm) {</span>&nbsp; <span class='diff-add'> cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);</span>&nbsp; <span class='diff-add'> resetModeState(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function resetModeState(cm) {</span>&nbsp; <span class='diff-add'> cm.doc.iter(function(line) {</span>&nbsp; <span class='diff-add'> if (line.stateAfter) line.stateAfter = null;</span>&nbsp; <span class='diff-add'> if (line.styles) line.styles = null;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> cm.doc.frontier = cm.doc.first;</span>&nbsp; <span class='diff-add'> startWorker(cm, 100);</span>&nbsp; <span class='diff-add'> cm.state.modeGen++;</span>&nbsp; <span class='diff-add'> if (cm.curOp) regChange(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function wrappingChanged(cm) {</span>&nbsp; <span class='diff-add'> if (cm.options.lineWrapping) {</span>&nbsp; <span class='diff-add'> addClass(cm.display.wrapper, "CodeMirror-wrap");</span>&nbsp; <span class='diff-add'> cm.display.sizer.style.minWidth = "";</span>&nbsp; <span class='diff-add'> cm.display.sizerWidth = null;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> rmClass(cm.display.wrapper, "CodeMirror-wrap");</span>&nbsp; <span class='diff-add'> findMaxLine(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> estimateLineHeights(cm);</span>&nbsp; <span class='diff-add'> regChange(cm);</span>&nbsp; <span class='diff-add'> clearCaches(cm);</span>&nbsp; <span class='diff-add'> setTimeout(function(){updateScrollbars(cm);}, 100);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Returns a function that estimates the height of a line, to use as</span>&nbsp; <span class='diff-add'> // first approximation until the line becomes visible (and is thus</span>&nbsp; <span class='diff-add'> // properly measurable).</span>&nbsp; <span class='diff-add'> function estimateHeight(cm) {</span>&nbsp; <span class='diff-add'> var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;</span>&nbsp; <span class='diff-add'> var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);</span>&nbsp; <span class='diff-add'> return function(line) {</span>&nbsp; <span class='diff-add'> if (lineIsHidden(cm.doc, line)) return 0;</span>&nbsp; <span class='diff-add'> var widgetsHeight = 0;</span>&nbsp; <span class='diff-add'> if (line.widgets) for (var i = 0; i < line.widgets.length; i++) {</span>&nbsp; <span class='diff-add'> if (line.widgets[i].height) widgetsHeight += line.widgets[i].height;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (wrapping)</span>&nbsp; <span class='diff-add'> return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th;</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> return widgetsHeight + th;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function estimateLineHeights(cm) {</span>&nbsp; <span class='diff-add'> var doc = cm.doc, est = estimateHeight(cm);</span>&nbsp; <span class='diff-add'> doc.iter(function(line) {</span>&nbsp; <span class='diff-add'> var estHeight = est(line);</span>&nbsp; <span class='diff-add'> if (estHeight != line.height) updateLineHeight(line, estHeight);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function themeChanged(cm) {</span>&nbsp; <span class='diff-add'> cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +</span>&nbsp; <span class='diff-add'> cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");</span>&nbsp; <span class='diff-add'> clearCaches(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function guttersChanged(cm) {</span>&nbsp; <span class='diff-add'> updateGutters(cm);</span>&nbsp; <span class='diff-add'> regChange(cm);</span>&nbsp; <span class='diff-add'> setTimeout(function(){alignHorizontally(cm);}, 20);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Rebuild the gutter elements, ensure the margin to the left of the</span>&nbsp; <span class='diff-add'> // code matches their width.</span>&nbsp; <span class='diff-add'> function updateGutters(cm) {</span>&nbsp; <span class='diff-add'> var gutters = cm.display.gutters, specs = cm.options.gutters;</span>&nbsp; <span class='diff-add'> removeChildren(gutters);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < specs.length; ++i) {</span>&nbsp; <span class='diff-add'> var gutterClass = specs[i];</span>&nbsp; <span class='diff-add'> var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));</span>&nbsp; <span class='diff-add'> if (gutterClass == "CodeMirror-linenumbers") {</span>&nbsp; <span class='diff-add'> cm.display.lineGutter = gElt;</span>&nbsp; <span class='diff-add'> gElt.style.width = (cm.display.lineNumWidth || 1) + "px";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> gutters.style.display = i ? "" : "none";</span>&nbsp; <span class='diff-add'> updateGutterSpace(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function updateGutterSpace(cm) {</span>&nbsp; <span class='diff-add'> var width = cm.display.gutters.offsetWidth;</span>&nbsp; <span class='diff-add'> cm.display.sizer.style.marginLeft = width + "px";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Compute the character length of a line, taking into account</span>&nbsp; <span class='diff-add'> // collapsed ranges (see markText) that might hide parts, and join</span>&nbsp; <span class='diff-add'> // other lines onto it.</span>&nbsp; <span class='diff-add'> function lineLength(line) {</span>&nbsp; <span class='diff-add'> if (line.height == 0) return 0;</span>&nbsp; <span class='diff-add'> var len = line.text.length, merged, cur = line;</span>&nbsp; <span class='diff-add'> while (merged = collapsedSpanAtStart(cur)) {</span>&nbsp; <span class='diff-add'> var found = merged.find(0, true);</span>&nbsp; <span class='diff-add'> cur = found.from.line;</span>&nbsp; <span class='diff-add'> len += found.from.ch - found.to.ch;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cur = line;</span>&nbsp; <span class='diff-add'> while (merged = collapsedSpanAtEnd(cur)) {</span>&nbsp; <span class='diff-add'> var found = merged.find(0, true);</span>&nbsp; <span class='diff-add'> len -= cur.text.length - found.from.ch;</span>&nbsp; <span class='diff-add'> cur = found.to.line;</span>&nbsp; <span class='diff-add'> len += cur.text.length - found.to.ch;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return len;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Find the longest line in the document.</span>&nbsp; <span class='diff-add'> function findMaxLine(cm) {</span>&nbsp; <span class='diff-add'> var d = cm.display, doc = cm.doc;</span>&nbsp; <span class='diff-add'> d.maxLine = getLine(doc, doc.first);</span>&nbsp; <span class='diff-add'> d.maxLineLength = lineLength(d.maxLine);</span>&nbsp; <span class='diff-add'> d.maxLineChanged = true;</span>&nbsp; <span class='diff-add'> doc.iter(function(line) {</span>&nbsp; <span class='diff-add'> var len = lineLength(line);</span>&nbsp; <span class='diff-add'> if (len > d.maxLineLength) {</span>&nbsp; <span class='diff-add'> d.maxLineLength = len;</span>&nbsp; <span class='diff-add'> d.maxLine = line;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Make sure the gutters options contains the element</span>&nbsp; <span class='diff-add'> // "CodeMirror-linenumbers" when the lineNumbers option is true.</span>&nbsp; <span class='diff-add'> function setGuttersForLineNumbers(options) {</span>&nbsp; <span class='diff-add'> var found = indexOf(options.gutters, "CodeMirror-linenumbers");</span>&nbsp; <span class='diff-add'> if (found == -1 && options.lineNumbers) {</span>&nbsp; <span class='diff-add'> options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]);</span>&nbsp; <span class='diff-add'> } else if (found > -1 && !options.lineNumbers) {</span>&nbsp; <span class='diff-add'> options.gutters = options.gutters.slice(0);</span>&nbsp; <span class='diff-add'> options.gutters.splice(found, 1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // SCROLLBARS</span>&nbsp; <span class='diff-add'> // Prepare DOM reads needed to update the scrollbars. Done in one</span>&nbsp; <span class='diff-add'> // shot to minimize update/measure roundtrips.</span>&nbsp; <span class='diff-add'> function measureForScrollbars(cm) {</span>&nbsp; <span class='diff-add'> var d = cm.display, gutterW = d.gutters.offsetWidth;</span>&nbsp; <span class='diff-add'> var docH = Math.round(cm.doc.height + paddingVert(cm.display));</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> clientHeight: d.scroller.clientHeight,</span>&nbsp; <span class='diff-add'> viewHeight: d.wrapper.clientHeight,</span>&nbsp; <span class='diff-add'> scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,</span>&nbsp; <span class='diff-add'> viewWidth: d.wrapper.clientWidth,</span>&nbsp; <span class='diff-add'> barLeft: cm.options.fixedGutter ? gutterW : 0,</span>&nbsp; <span class='diff-add'> docHeight: docH,</span>&nbsp; <span class='diff-add'> scrollHeight: docH + scrollGap(cm) + d.barHeight,</span>&nbsp; <span class='diff-add'> nativeBarWidth: d.nativeBarWidth,</span>&nbsp; <span class='diff-add'> gutterWidth: gutterW</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function NativeScrollbars(place, scroll, cm) {</span>&nbsp; <span class='diff-add'> this.cm = cm;</span>&nbsp; <span class='diff-add'> var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");</span>&nbsp; <span class='diff-add'> var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");</span>&nbsp; <span class='diff-add'> place(vert); place(horiz);</span>&nbsp; <span class='diff-add'> on(vert, "scroll", function() {</span>&nbsp; <span class='diff-add'> if (vert.clientHeight) scroll(vert.scrollTop, "vertical");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> on(horiz, "scroll", function() {</span>&nbsp; <span class='diff-add'> if (horiz.clientWidth) scroll(horiz.scrollLeft, "horizontal");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.checkedOverlay = false;</span>&nbsp; <span class='diff-add'> // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 8) this.horiz.style.minHeight = this.vert.style.minWidth = "18px";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> NativeScrollbars.prototype = copyObj({</span>&nbsp; <span class='diff-add'> update: function(measure) {</span>&nbsp; <span class='diff-add'> var needsH = measure.scrollWidth > measure.clientWidth + 1;</span>&nbsp; <span class='diff-add'> var needsV = measure.scrollHeight > measure.clientHeight + 1;</span>&nbsp; <span class='diff-add'> var sWidth = measure.nativeBarWidth;</span>&nbsp; <span class='diff-add'> if (needsV) {</span>&nbsp; <span class='diff-add'> this.vert.style.display = "block";</span>&nbsp; <span class='diff-add'> this.vert.style.bottom = needsH ? sWidth + "px" : "0";</span>&nbsp; <span class='diff-add'> var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);</span>&nbsp; <span class='diff-add'> // A bug in IE8 can cause this value to be negative, so guard it.</span>&nbsp; <span class='diff-add'> this.vert.firstChild.style.height =</span>&nbsp; <span class='diff-add'> Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.vert.style.display = "";</span>&nbsp; <span class='diff-add'> this.vert.firstChild.style.height = "0";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (needsH) {</span>&nbsp; <span class='diff-add'> this.horiz.style.display = "block";</span>&nbsp; <span class='diff-add'> this.horiz.style.right = needsV ? sWidth + "px" : "0";</span>&nbsp; <span class='diff-add'> this.horiz.style.left = measure.barLeft + "px";</span>&nbsp; <span class='diff-add'> var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);</span>&nbsp; <span class='diff-add'> this.horiz.firstChild.style.width =</span>&nbsp; <span class='diff-add'> (measure.scrollWidth - measure.clientWidth + totalWidth) + "px";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.horiz.style.display = "";</span>&nbsp; <span class='diff-add'> this.horiz.firstChild.style.width = "0";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!this.checkedOverlay && measure.clientHeight > 0) {</span>&nbsp; <span class='diff-add'> if (sWidth == 0) this.overlayHack();</span>&nbsp; <span class='diff-add'> this.checkedOverlay = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0};</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> setScrollLeft: function(pos) {</span>&nbsp; <span class='diff-add'> if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> setScrollTop: function(pos) {</span>&nbsp; <span class='diff-add'> if (this.vert.scrollTop != pos) this.vert.scrollTop = pos;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> overlayHack: function() {</span>&nbsp; <span class='diff-add'> var w = mac && !mac_geMountainLion ? "12px" : "18px";</span>&nbsp; <span class='diff-add'> this.horiz.style.minHeight = this.vert.style.minWidth = w;</span>&nbsp; <span class='diff-add'> var self = this;</span>&nbsp; <span class='diff-add'> var barMouseDown = function(e) {</span>&nbsp; <span class='diff-add'> if (e_target(e) != self.vert && e_target(e) != self.horiz)</span>&nbsp; <span class='diff-add'> operation(self.cm, onMouseDown)(e);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> on(this.vert, "mousedown", barMouseDown);</span>&nbsp; <span class='diff-add'> on(this.horiz, "mousedown", barMouseDown);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> clear: function() {</span>&nbsp; <span class='diff-add'> var parent = this.horiz.parentNode;</span>&nbsp; <span class='diff-add'> parent.removeChild(this.horiz);</span>&nbsp; <span class='diff-add'> parent.removeChild(this.vert);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, NativeScrollbars.prototype);</span>&nbsp; <span class='diff-add'> function NullScrollbars() {}</span>&nbsp; <span class='diff-add'> NullScrollbars.prototype = copyObj({</span>&nbsp; <span class='diff-add'> update: function() { return {bottom: 0, right: 0}; },</span>&nbsp; <span class='diff-add'> setScrollLeft: function() {},</span>&nbsp; <span class='diff-add'> setScrollTop: function() {},</span>&nbsp; <span class='diff-add'> clear: function() {}</span>&nbsp; <span class='diff-add'> }, NullScrollbars.prototype);</span>&nbsp; <span class='diff-add'> CodeMirror.scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars};</span>&nbsp; <span class='diff-add'> function initScrollbars(cm) {</span>&nbsp; <span class='diff-add'> if (cm.display.scrollbars) {</span>&nbsp; <span class='diff-add'> cm.display.scrollbars.clear();</span>&nbsp; <span class='diff-add'> if (cm.display.scrollbars.addClass)</span>&nbsp; <span class='diff-add'> rmClass(cm.display.wrapper, cm.display.scrollbars.addClass);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.display.scrollbars = new CodeMirror.scrollbarModel[cm.options.scrollbarStyle](function(node) {</span>&nbsp; <span class='diff-add'> cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);</span>&nbsp; <span class='diff-add'> on(node, "mousedown", function() {</span>&nbsp; <span class='diff-add'> if (cm.state.focused) setTimeout(bind(focusInput, cm), 0);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> node.setAttribute("not-content", "true");</span>&nbsp; <span class='diff-add'> }, function(pos, axis) {</span>&nbsp; <span class='diff-add'> if (axis == "horizontal") setScrollLeft(cm, pos);</span>&nbsp; <span class='diff-add'> else setScrollTop(cm, pos);</span>&nbsp; <span class='diff-add'> }, cm);</span>&nbsp; <span class='diff-add'> if (cm.display.scrollbars.addClass)</span>&nbsp; <span class='diff-add'> addClass(cm.display.wrapper, cm.display.scrollbars.addClass);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function updateScrollbars(cm, measure) {</span>&nbsp; <span class='diff-add'> if (!measure) measure = measureForScrollbars(cm);</span>&nbsp; <span class='diff-add'> var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;</span>&nbsp; <span class='diff-add'> updateScrollbarsInner(cm, measure);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {</span>&nbsp; <span class='diff-add'> if (startWidth != cm.display.barWidth && cm.options.lineWrapping)</span>&nbsp; <span class='diff-add'> updateHeightsInViewport(cm);</span>&nbsp; <span class='diff-add'> updateScrollbarsInner(cm, measureForScrollbars(cm));</span>&nbsp; <span class='diff-add'> startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Re-synchronize the fake scrollbars with the actual size of the</span>&nbsp; <span class='diff-add'> // content.</span>&nbsp; <span class='diff-add'> function updateScrollbarsInner(cm, measure) {</span>&nbsp; <span class='diff-add'> var d = cm.display;</span>&nbsp; <span class='diff-add'> var sizes = d.scrollbars.update(measure);</span>&nbsp; <span class='diff-add'> d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px";</span>&nbsp; <span class='diff-add'> d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px";</span>&nbsp; <span class='diff-add'> if (sizes.right && sizes.bottom) {</span>&nbsp; <span class='diff-add'> d.scrollbarFiller.style.display = "block";</span>&nbsp; <span class='diff-add'> d.scrollbarFiller.style.height = sizes.bottom + "px";</span>&nbsp; <span class='diff-add'> d.scrollbarFiller.style.width = sizes.right + "px";</span>&nbsp; <span class='diff-add'> } else d.scrollbarFiller.style.display = "";</span>&nbsp; <span class='diff-add'> if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {</span>&nbsp; <span class='diff-add'> d.gutterFiller.style.display = "block";</span>&nbsp; <span class='diff-add'> d.gutterFiller.style.height = sizes.bottom + "px";</span>&nbsp; <span class='diff-add'> d.gutterFiller.style.width = measure.gutterWidth + "px";</span>&nbsp; <span class='diff-add'> } else d.gutterFiller.style.display = "";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Compute the lines that are visible in a given viewport (defaults</span>&nbsp; <span class='diff-add'> // the the current scroll position). viewport may contain top,</span>&nbsp; <span class='diff-add'> // height, and ensure (see op.scrollToPos) properties.</span>&nbsp; <span class='diff-add'> function visibleLines(display, doc, viewport) {</span>&nbsp; <span class='diff-add'> var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;</span>&nbsp; <span class='diff-add'> top = Math.floor(top - paddingTop(display));</span>&nbsp; <span class='diff-add'> var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;</span>&nbsp; <span class='diff-add'> var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);</span>&nbsp; <span class='diff-add'> // Ensure is a {from: {line, ch}, to: {line, ch}} object, and</span>&nbsp; <span class='diff-add'> // forces those lines into the viewport (if possible).</span>&nbsp; <span class='diff-add'> if (viewport && viewport.ensure) {</span>&nbsp; <span class='diff-add'> var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;</span>&nbsp; <span class='diff-add'> if (ensureFrom < from) {</span>&nbsp; <span class='diff-add'> from = ensureFrom;</span>&nbsp; <span class='diff-add'> to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);</span>&nbsp; <span class='diff-add'> } else if (Math.min(ensureTo, doc.lastLine()) >= to) {</span>&nbsp; <span class='diff-add'> from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);</span>&nbsp; <span class='diff-add'> to = ensureTo;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {from: from, to: Math.max(to, from + 1)};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // LINE NUMBERS</span>&nbsp; <span class='diff-add'> // Re-align line numbers and gutter marks to compensate for</span>&nbsp; <span class='diff-add'> // horizontal scrolling.</span>&nbsp; <span class='diff-add'> function alignHorizontally(cm) {</span>&nbsp; <span class='diff-add'> var display = cm.display, view = display.view;</span>&nbsp; <span class='diff-add'> if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;</span>&nbsp; <span class='diff-add'> var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;</span>&nbsp; <span class='diff-add'> var gutterW = display.gutters.offsetWidth, left = comp + "px";</span>&nbsp; <span class='diff-add'> for (var i = 0; i < view.length; i++) if (!view[i].hidden) {</span>&nbsp; <span class='diff-add'> if (cm.options.fixedGutter && view[i].gutter)</span>&nbsp; <span class='diff-add'> view[i].gutter.style.left = left;</span>&nbsp; <span class='diff-add'> var align = view[i].alignable;</span>&nbsp; <span class='diff-add'> if (align) for (var j = 0; j < align.length; j++)</span>&nbsp; <span class='diff-add'> align[j].style.left = left;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (cm.options.fixedGutter)</span>&nbsp; <span class='diff-add'> display.gutters.style.left = (comp + gutterW) + "px";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Used to ensure that the line number gutter is still the right</span>&nbsp; <span class='diff-add'> // size for the current document size. Returns true when an update</span>&nbsp; <span class='diff-add'> // is needed.</span>&nbsp; <span class='diff-add'> function maybeUpdateLineNumberWidth(cm) {</span>&nbsp; <span class='diff-add'> if (!cm.options.lineNumbers) return false;</span>&nbsp; <span class='diff-add'> var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;</span>&nbsp; <span class='diff-add'> if (last.length != display.lineNumChars) {</span>&nbsp; <span class='diff-add'> var test = display.measure.appendChild(elt("div", [elt("div", last)],</span>&nbsp; <span class='diff-add'> "CodeMirror-linenumber CodeMirror-gutter-elt"));</span>&nbsp; <span class='diff-add'> var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;</span>&nbsp; <span class='diff-add'> display.lineGutter.style.width = "";</span>&nbsp; <span class='diff-add'> display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);</span>&nbsp; <span class='diff-add'> display.lineNumWidth = display.lineNumInnerWidth + padding;</span>&nbsp; <span class='diff-add'> display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;</span>&nbsp; <span class='diff-add'> display.lineGutter.style.width = display.lineNumWidth + "px";</span>&nbsp; <span class='diff-add'> updateGutterSpace(cm);</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function lineNumberFor(options, i) {</span>&nbsp; <span class='diff-add'> return String(options.lineNumberFormatter(i + options.firstLineNumber));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,</span>&nbsp; <span class='diff-add'> // but using getBoundingClientRect to get a sub-pixel-accurate</span>&nbsp; <span class='diff-add'> // result.</span>&nbsp; <span class='diff-add'> function compensateForHScroll(display) {</span>&nbsp; <span class='diff-add'> return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // DISPLAY DRAWING</span>&nbsp; <span class='diff-add'> function DisplayUpdate(cm, viewport, force) {</span>&nbsp; <span class='diff-add'> var display = cm.display;</span>&nbsp; <span class='diff-add'> this.viewport = viewport;</span>&nbsp; <span class='diff-add'> // Store some values that we'll need later (but don't want to force a relayout for)</span>&nbsp; <span class='diff-add'> this.visible = visibleLines(display, cm.doc, viewport);</span>&nbsp; <span class='diff-add'> this.editorIsHidden = !display.wrapper.offsetWidth;</span>&nbsp; <span class='diff-add'> this.wrapperHeight = display.wrapper.clientHeight;</span>&nbsp; <span class='diff-add'> this.wrapperWidth = display.wrapper.clientWidth;</span>&nbsp; <span class='diff-add'> this.oldDisplayWidth = displayWidth(cm);</span>&nbsp; <span class='diff-add'> this.force = force;</span>&nbsp; <span class='diff-add'> this.dims = getDimensions(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function maybeClipScrollbars(cm) {</span>&nbsp; <span class='diff-add'> var display = cm.display;</span>&nbsp; <span class='diff-add'> if (!display.scrollbarsClipped && display.scroller.offsetWidth) {</span>&nbsp; <span class='diff-add'> display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;</span>&nbsp; <span class='diff-add'> display.heightForcer.style.height = scrollGap(cm) + "px";</span>&nbsp; <span class='diff-add'> display.sizer.style.marginBottom = -display.nativeBarWidth + "px";</span>&nbsp; <span class='diff-add'> display.sizer.style.borderRightWidth = scrollGap(cm) + "px";</span>&nbsp; <span class='diff-add'> display.scrollbarsClipped = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Does the actual updating of the line display. Bails out</span>&nbsp; <span class='diff-add'> // (returning false) when there is nothing to be done and forced is</span>&nbsp; <span class='diff-add'> // false.</span>&nbsp; <span class='diff-add'> function updateDisplayIfNeeded(cm, update) {</span>&nbsp; <span class='diff-add'> var display = cm.display, doc = cm.doc;</span>&nbsp; <span class='diff-add'> if (update.editorIsHidden) {</span>&nbsp; <span class='diff-add'> resetView(cm);</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Bail out if the visible area is already rendered and nothing changed.</span>&nbsp; <span class='diff-add'> if (!update.force &&</span>&nbsp; <span class='diff-add'> update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&</span>&nbsp; <span class='diff-add'> (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&</span>&nbsp; <span class='diff-add'> display.renderedView == display.view && countDirtyView(cm) == 0)</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> if (maybeUpdateLineNumberWidth(cm)) {</span>&nbsp; <span class='diff-add'> resetView(cm);</span>&nbsp; <span class='diff-add'> update.dims = getDimensions(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Compute a suitable new viewport (from & to)</span>&nbsp; <span class='diff-add'> var end = doc.first + doc.size;</span>&nbsp; <span class='diff-add'> var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);</span>&nbsp; <span class='diff-add'> var to = Math.min(end, update.visible.to + cm.options.viewportMargin);</span>&nbsp; <span class='diff-add'> if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);</span>&nbsp; <span class='diff-add'> if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);</span>&nbsp; <span class='diff-add'> if (sawCollapsedSpans) {</span>&nbsp; <span class='diff-add'> from = visualLineNo(cm.doc, from);</span>&nbsp; <span class='diff-add'> to = visualLineEndNo(cm.doc, to);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var different = from != display.viewFrom || to != display.viewTo ||</span>&nbsp; <span class='diff-add'> display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;</span>&nbsp; <span class='diff-add'> adjustView(cm, from, to);</span>&nbsp; <span class='diff-add'> display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));</span>&nbsp; <span class='diff-add'> // Position the mover div to align with the current scroll position</span>&nbsp; <span class='diff-add'> cm.display.mover.style.top = display.viewOffset + "px";</span>&nbsp; <span class='diff-add'> var toUpdate = countDirtyView(cm);</span>&nbsp; <span class='diff-add'> if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&</span>&nbsp; <span class='diff-add'> (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> // For big changes, we hide the enclosing element during the</span>&nbsp; <span class='diff-add'> // update, since that speeds up the operations on most browsers.</span>&nbsp; <span class='diff-add'> var focused = activeElt();</span>&nbsp; <span class='diff-add'> if (toUpdate > 4) display.lineDiv.style.display = "none";</span>&nbsp; <span class='diff-add'> patchDisplay(cm, display.updateLineNumbers, update.dims);</span>&nbsp; <span class='diff-add'> if (toUpdate > 4) display.lineDiv.style.display = "";</span>&nbsp; <span class='diff-add'> display.renderedView = display.view;</span>&nbsp; <span class='diff-add'> // There might have been a widget with a focused element that got</span>&nbsp; <span class='diff-add'> // hidden or updated, if so re-focus it.</span>&nbsp; <span class='diff-add'> if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();</span>&nbsp; <span class='diff-add'> // Prevent selection and cursors from interfering with the scroll</span>&nbsp; <span class='diff-add'> // width and height.</span>&nbsp; <span class='diff-add'> removeChildren(display.cursorDiv);</span>&nbsp; <span class='diff-add'> removeChildren(display.selectionDiv);</span>&nbsp; <span class='diff-add'> display.gutters.style.height = 0;</span>&nbsp; <span class='diff-add'> if (different) {</span>&nbsp; <span class='diff-add'> display.lastWrapHeight = update.wrapperHeight;</span>&nbsp; <span class='diff-add'> display.lastWrapWidth = update.wrapperWidth;</span>&nbsp; <span class='diff-add'> startWorker(cm, 400);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> display.updateLineNumbers = null;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function postUpdateDisplay(cm, update) {</span>&nbsp; <span class='diff-add'> var force = update.force, viewport = update.viewport;</span>&nbsp; <span class='diff-add'> for (var first = true;; first = false) {</span>&nbsp; <span class='diff-add'> if (first && cm.options.lineWrapping && update.oldDisplayWidth != displayWidth(cm)) {</span>&nbsp; <span class='diff-add'> force = true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> force = false;</span>&nbsp; <span class='diff-add'> // Clip forced viewport to actual scrollable area.</span>&nbsp; <span class='diff-add'> if (viewport && viewport.top != null)</span>&nbsp; <span class='diff-add'> viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)};</span>&nbsp; <span class='diff-add'> // Updated line heights might result in the drawn area not</span>&nbsp; <span class='diff-add'> // actually covering the viewport. Keep looping until it does.</span>&nbsp; <span class='diff-add'> update.visible = visibleLines(cm.display, cm.doc, viewport);</span>&nbsp; <span class='diff-add'> if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!updateDisplayIfNeeded(cm, update)) break;</span>&nbsp; <span class='diff-add'> updateHeightsInViewport(cm);</span>&nbsp; <span class='diff-add'> var barMeasure = measureForScrollbars(cm);</span>&nbsp; <span class='diff-add'> updateSelection(cm);</span>&nbsp; <span class='diff-add'> setDocumentHeight(cm, barMeasure);</span>&nbsp; <span class='diff-add'> updateScrollbars(cm, barMeasure);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> signalLater(cm, "update", cm);</span>&nbsp; <span class='diff-add'> if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {</span>&nbsp; <span class='diff-add'> signalLater(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);</span>&nbsp; <span class='diff-add'> cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function updateDisplaySimple(cm, viewport) {</span>&nbsp; <span class='diff-add'> var update = new DisplayUpdate(cm, viewport);</span>&nbsp; <span class='diff-add'> if (updateDisplayIfNeeded(cm, update)) {</span>&nbsp; <span class='diff-add'> updateHeightsInViewport(cm);</span>&nbsp; <span class='diff-add'> postUpdateDisplay(cm, update);</span>&nbsp; <span class='diff-add'> var barMeasure = measureForScrollbars(cm);</span>&nbsp; <span class='diff-add'> updateSelection(cm);</span>&nbsp; <span class='diff-add'> setDocumentHeight(cm, barMeasure);</span>&nbsp; <span class='diff-add'> updateScrollbars(cm, barMeasure);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function setDocumentHeight(cm, measure) {</span>&nbsp; <span class='diff-add'> cm.display.sizer.style.minHeight = measure.docHeight + "px";</span>&nbsp; <span class='diff-add'> var total = measure.docHeight + cm.display.barHeight;</span>&nbsp; <span class='diff-add'> cm.display.heightForcer.style.top = total + "px";</span>&nbsp; <span class='diff-add'> cm.display.gutters.style.height = Math.max(total + scrollGap(cm), measure.clientHeight) + "px";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Read the actual heights of the rendered lines, and update their</span>&nbsp; <span class='diff-add'> // stored heights to match.</span>&nbsp; <span class='diff-add'> function updateHeightsInViewport(cm) {</span>&nbsp; <span class='diff-add'> var display = cm.display;</span>&nbsp; <span class='diff-add'> var prevBottom = display.lineDiv.offsetTop;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < display.view.length; i++) {</span>&nbsp; <span class='diff-add'> var cur = display.view[i], height;</span>&nbsp; <span class='diff-add'> if (cur.hidden) continue;</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 8) {</span>&nbsp; <span class='diff-add'> var bot = cur.node.offsetTop + cur.node.offsetHeight;</span>&nbsp; <span class='diff-add'> height = bot - prevBottom;</span>&nbsp; <span class='diff-add'> prevBottom = bot;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var box = cur.node.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> height = box.bottom - box.top;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var diff = cur.line.height - height;</span>&nbsp; <span class='diff-add'> if (height < 2) height = textHeight(display);</span>&nbsp; <span class='diff-add'> if (diff > .001 || diff < -.001) {</span>&nbsp; <span class='diff-add'> updateLineHeight(cur.line, height);</span>&nbsp; <span class='diff-add'> updateWidgetHeight(cur.line);</span>&nbsp; <span class='diff-add'> if (cur.rest) for (var j = 0; j < cur.rest.length; j++)</span>&nbsp; <span class='diff-add'> updateWidgetHeight(cur.rest[j]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Read and store the height of line widgets associated with the</span>&nbsp; <span class='diff-add'> // given line.</span>&nbsp; <span class='diff-add'> function updateWidgetHeight(line) {</span>&nbsp; <span class='diff-add'> if (line.widgets) for (var i = 0; i < line.widgets.length; ++i)</span>&nbsp; <span class='diff-add'> line.widgets[i].height = line.widgets[i].node.offsetHeight;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Do a bulk-read of the DOM positions and sizes needed to draw the</span>&nbsp; <span class='diff-add'> // view, so that we don't interleave reading and writing to the DOM.</span>&nbsp; <span class='diff-add'> function getDimensions(cm) {</span>&nbsp; <span class='diff-add'> var d = cm.display, left = {}, width = {};</span>&nbsp; <span class='diff-add'> var gutterLeft = d.gutters.clientLeft;</span>&nbsp; <span class='diff-add'> for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {</span>&nbsp; <span class='diff-add'> left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;</span>&nbsp; <span class='diff-add'> width[cm.options.gutters[i]] = n.clientWidth;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {fixedPos: compensateForHScroll(d),</span>&nbsp; <span class='diff-add'> gutterTotalWidth: d.gutters.offsetWidth,</span>&nbsp; <span class='diff-add'> gutterLeft: left,</span>&nbsp; <span class='diff-add'> gutterWidth: width,</span>&nbsp; <span class='diff-add'> wrapperWidth: d.wrapper.clientWidth};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Sync the actual display DOM structure with display.view, removing</span>&nbsp; <span class='diff-add'> // nodes for lines that are no longer in view, and creating the ones</span>&nbsp; <span class='diff-add'> // that are not there yet, and updating the ones that are out of</span>&nbsp; <span class='diff-add'> // date.</span>&nbsp; <span class='diff-add'> function patchDisplay(cm, updateNumbersFrom, dims) {</span>&nbsp; <span class='diff-add'> var display = cm.display, lineNumbers = cm.options.lineNumbers;</span>&nbsp; <span class='diff-add'> var container = display.lineDiv, cur = container.firstChild;</span>&nbsp; <span class='diff-add'> function rm(node) {</span>&nbsp; <span class='diff-add'> var next = node.nextSibling;</span>&nbsp; <span class='diff-add'> // Works around a throw-scroll bug in OS X Webkit</span>&nbsp; <span class='diff-add'> if (webkit && mac && cm.display.currentWheelTarget == node)</span>&nbsp; <span class='diff-add'> node.style.display = "none";</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> node.parentNode.removeChild(node);</span>&nbsp; <span class='diff-add'> return next;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var view = display.view, lineN = display.viewFrom;</span>&nbsp; <span class='diff-add'> // Loop over the elements in the view, syncing cur (the DOM nodes</span>&nbsp; <span class='diff-add'> // in display.lineDiv) with the view as we go.</span>&nbsp; <span class='diff-add'> for (var i = 0; i < view.length; i++) {</span>&nbsp; <span class='diff-add'> var lineView = view[i];</span>&nbsp; <span class='diff-add'> if (lineView.hidden) {</span>&nbsp; <span class='diff-add'> } else if (!lineView.node) { // Not drawn yet</span>&nbsp; <span class='diff-add'> var node = buildLineElement(cm, lineView, lineN, dims);</span>&nbsp; <span class='diff-add'> container.insertBefore(node, cur);</span>&nbsp; <span class='diff-add'> } else { // Already drawn</span>&nbsp; <span class='diff-add'> while (cur != lineView.node) cur = rm(cur);</span>&nbsp; <span class='diff-add'> var updateNumber = lineNumbers && updateNumbersFrom != null &&</span>&nbsp; <span class='diff-add'> updateNumbersFrom <= lineN && lineView.lineNumber;</span>&nbsp; <span class='diff-add'> if (lineView.changes) {</span>&nbsp; <span class='diff-add'> if (indexOf(lineView.changes, "gutter") > -1) updateNumber = false;</span>&nbsp; <span class='diff-add'> updateLineForChanges(cm, lineView, lineN, dims);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (updateNumber) {</span>&nbsp; <span class='diff-add'> removeChildren(lineView.lineNumber);</span>&nbsp; <span class='diff-add'> lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cur = lineView.node.nextSibling;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> lineN += lineView.size;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> while (cur) cur = rm(cur);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // When an aspect of a line changes, a string is added to</span>&nbsp; <span class='diff-add'> // lineView.changes. This updates the relevant part of the line's</span>&nbsp; <span class='diff-add'> // DOM structure.</span>&nbsp; <span class='diff-add'> function updateLineForChanges(cm, lineView, lineN, dims) {</span>&nbsp; <span class='diff-add'> for (var j = 0; j < lineView.changes.length; j++) {</span>&nbsp; <span class='diff-add'> var type = lineView.changes[j];</span>&nbsp; <span class='diff-add'> if (type == "text") updateLineText(cm, lineView);</span>&nbsp; <span class='diff-add'> else if (type == "gutter") updateLineGutter(cm, lineView, lineN, dims);</span>&nbsp; <span class='diff-add'> else if (type == "class") updateLineClasses(lineView);</span>&nbsp; <span class='diff-add'> else if (type == "widget") updateLineWidgets(lineView, dims);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> lineView.changes = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Lines with gutter elements, widgets or a background class need to</span>&nbsp; <span class='diff-add'> // be wrapped, and have the extra elements added to the wrapper div</span>&nbsp; <span class='diff-add'> function ensureLineWrapped(lineView) {</span>&nbsp; <span class='diff-add'> if (lineView.node == lineView.text) {</span>&nbsp; <span class='diff-add'> lineView.node = elt("div", null, null, "position: relative");</span>&nbsp; <span class='diff-add'> if (lineView.text.parentNode)</span>&nbsp; <span class='diff-add'> lineView.text.parentNode.replaceChild(lineView.node, lineView.text);</span>&nbsp; <span class='diff-add'> lineView.node.appendChild(lineView.text);</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 8) lineView.node.style.zIndex = 2;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return lineView.node;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function updateLineBackground(lineView) {</span>&nbsp; <span class='diff-add'> var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;</span>&nbsp; <span class='diff-add'> if (cls) cls += " CodeMirror-linebackground";</span>&nbsp; <span class='diff-add'> if (lineView.background) {</span>&nbsp; <span class='diff-add'> if (cls) lineView.background.className = cls;</span>&nbsp; <span class='diff-add'> else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }</span>&nbsp; <span class='diff-add'> } else if (cls) {</span>&nbsp; <span class='diff-add'> var wrap = ensureLineWrapped(lineView);</span>&nbsp; <span class='diff-add'> lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Wrapper around buildLineContent which will reuse the structure</span>&nbsp; <span class='diff-add'> // in display.externalMeasured when possible.</span>&nbsp; <span class='diff-add'> function getLineContent(cm, lineView) {</span>&nbsp; <span class='diff-add'> var ext = cm.display.externalMeasured;</span>&nbsp; <span class='diff-add'> if (ext && ext.line == lineView.line) {</span>&nbsp; <span class='diff-add'> cm.display.externalMeasured = null;</span>&nbsp; <span class='diff-add'> lineView.measure = ext.measure;</span>&nbsp; <span class='diff-add'> return ext.built;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return buildLineContent(cm, lineView);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Redraw the line's text. Interacts with the background and text</span>&nbsp; <span class='diff-add'> // classes because the mode may output tokens that influence these</span>&nbsp; <span class='diff-add'> // classes.</span>&nbsp; <span class='diff-add'> function updateLineText(cm, lineView) {</span>&nbsp; <span class='diff-add'> var cls = lineView.text.className;</span>&nbsp; <span class='diff-add'> var built = getLineContent(cm, lineView);</span>&nbsp; <span class='diff-add'> if (lineView.text == lineView.node) lineView.node = built.pre;</span>&nbsp; <span class='diff-add'> lineView.text.parentNode.replaceChild(built.pre, lineView.text);</span>&nbsp; <span class='diff-add'> lineView.text = built.pre;</span>&nbsp; <span class='diff-add'> if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {</span>&nbsp; <span class='diff-add'> lineView.bgClass = built.bgClass;</span>&nbsp; <span class='diff-add'> lineView.textClass = built.textClass;</span>&nbsp; <span class='diff-add'> updateLineClasses(lineView);</span>&nbsp; <span class='diff-add'> } else if (cls) {</span>&nbsp; <span class='diff-add'> lineView.text.className = cls;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function updateLineClasses(lineView) {</span>&nbsp; <span class='diff-add'> updateLineBackground(lineView);</span>&nbsp; <span class='diff-add'> if (lineView.line.wrapClass)</span>&nbsp; <span class='diff-add'> ensureLineWrapped(lineView).className = lineView.line.wrapClass;</span>&nbsp; <span class='diff-add'> else if (lineView.node != lineView.text)</span>&nbsp; <span class='diff-add'> lineView.node.className = "";</span>&nbsp; <span class='diff-add'> var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;</span>&nbsp; <span class='diff-add'> lineView.text.className = textClass || "";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function updateLineGutter(cm, lineView, lineN, dims) {</span>&nbsp; <span class='diff-add'> if (lineView.gutter) {</span>&nbsp; <span class='diff-add'> lineView.node.removeChild(lineView.gutter);</span>&nbsp; <span class='diff-add'> lineView.gutter = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var markers = lineView.line.gutterMarkers;</span>&nbsp; <span class='diff-add'> if (cm.options.lineNumbers || markers) {</span>&nbsp; <span class='diff-add'> var wrap = ensureLineWrapped(lineView);</span>&nbsp; <span class='diff-add'> var gutterWrap = lineView.gutter =</span>&nbsp; <span class='diff-add'> wrap.insertBefore(elt("div", null, "CodeMirror-gutter-wrapper", "left: " +</span>&nbsp; <span class='diff-add'> (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) +</span>&nbsp; <span class='diff-add'> "px; width: " + dims.gutterTotalWidth + "px"),</span>&nbsp; <span class='diff-add'> lineView.text);</span>&nbsp; <span class='diff-add'> if (lineView.line.gutterClass)</span>&nbsp; <span class='diff-add'> gutterWrap.className += " " + lineView.line.gutterClass;</span>&nbsp; <span class='diff-add'> if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))</span>&nbsp; <span class='diff-add'> lineView.lineNumber = gutterWrap.appendChild(</span>&nbsp; <span class='diff-add'> elt("div", lineNumberFor(cm.options, lineN),</span>&nbsp; <span class='diff-add'> "CodeMirror-linenumber CodeMirror-gutter-elt",</span>&nbsp; <span class='diff-add'> "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "</span>&nbsp; <span class='diff-add'> + cm.display.lineNumInnerWidth + "px"));</span>&nbsp; <span class='diff-add'> if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) {</span>&nbsp; <span class='diff-add'> var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];</span>&nbsp; <span class='diff-add'> if (found)</span>&nbsp; <span class='diff-add'> gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +</span>&nbsp; <span class='diff-add'> dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function updateLineWidgets(lineView, dims) {</span>&nbsp; <span class='diff-add'> if (lineView.alignable) lineView.alignable = null;</span>&nbsp; <span class='diff-add'> for (var node = lineView.node.firstChild, next; node; node = next) {</span>&nbsp; <span class='diff-add'> var next = node.nextSibling;</span>&nbsp; <span class='diff-add'> if (node.className == "CodeMirror-linewidget")</span>&nbsp; <span class='diff-add'> lineView.node.removeChild(node);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> insertLineWidgets(lineView, dims);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Build a line's DOM representation from scratch</span>&nbsp; <span class='diff-add'> function buildLineElement(cm, lineView, lineN, dims) {</span>&nbsp; <span class='diff-add'> var built = getLineContent(cm, lineView);</span>&nbsp; <span class='diff-add'> lineView.text = lineView.node = built.pre;</span>&nbsp; <span class='diff-add'> if (built.bgClass) lineView.bgClass = built.bgClass;</span>&nbsp; <span class='diff-add'> if (built.textClass) lineView.textClass = built.textClass;</span>&nbsp; <span class='diff-add'> updateLineClasses(lineView);</span>&nbsp; <span class='diff-add'> updateLineGutter(cm, lineView, lineN, dims);</span>&nbsp; <span class='diff-add'> insertLineWidgets(lineView, dims);</span>&nbsp; <span class='diff-add'> return lineView.node;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // A lineView may contain multiple logical lines (when merged by</span>&nbsp; <span class='diff-add'> // collapsed spans). The widgets for all of them need to be drawn.</span>&nbsp; <span class='diff-add'> function insertLineWidgets(lineView, dims) {</span>&nbsp; <span class='diff-add'> insertLineWidgetsFor(lineView.line, lineView, dims, true);</span>&nbsp; <span class='diff-add'> if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)</span>&nbsp; <span class='diff-add'> insertLineWidgetsFor(lineView.rest[i], lineView, dims, false);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function insertLineWidgetsFor(line, lineView, dims, allowAbove) {</span>&nbsp; <span class='diff-add'> if (!line.widgets) return;</span>&nbsp; <span class='diff-add'> var wrap = ensureLineWrapped(lineView);</span>&nbsp; <span class='diff-add'> for (var i = 0, ws = line.widgets; i < ws.length; ++i) {</span>&nbsp; <span class='diff-add'> var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");</span>&nbsp; <span class='diff-add'> if (!widget.handleMouseEvents) node.setAttribute("cm-ignore-events", "true");</span>&nbsp; <span class='diff-add'> positionLineWidget(widget, node, lineView, dims);</span>&nbsp; <span class='diff-add'> if (allowAbove && widget.above)</span>&nbsp; <span class='diff-add'> wrap.insertBefore(node, lineView.gutter || lineView.text);</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> wrap.appendChild(node);</span>&nbsp; <span class='diff-add'> signalLater(widget, "redraw");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function positionLineWidget(widget, node, lineView, dims) {</span>&nbsp; <span class='diff-add'> if (widget.noHScroll) {</span>&nbsp; <span class='diff-add'> (lineView.alignable || (lineView.alignable = [])).push(node);</span>&nbsp; <span class='diff-add'> var width = dims.wrapperWidth;</span>&nbsp; <span class='diff-add'> node.style.left = dims.fixedPos + "px";</span>&nbsp; <span class='diff-add'> if (!widget.coverGutter) {</span>&nbsp; <span class='diff-add'> width -= dims.gutterTotalWidth;</span>&nbsp; <span class='diff-add'> node.style.paddingLeft = dims.gutterTotalWidth + "px";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> node.style.width = width + "px";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (widget.coverGutter) {</span>&nbsp; <span class='diff-add'> node.style.zIndex = 5;</span>&nbsp; <span class='diff-add'> node.style.position = "relative";</span>&nbsp; <span class='diff-add'> if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // POSITION OBJECT</span>&nbsp; <span class='diff-add'> // A Pos instance represents a position within the text.</span>&nbsp; <span class='diff-add'> var Pos = CodeMirror.Pos = function(line, ch) {</span>&nbsp; <span class='diff-add'> if (!(this instanceof Pos)) return new Pos(line, ch);</span>&nbsp; <span class='diff-add'> this.line = line; this.ch = ch;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Compare two positions, return 0 if they are the same, a negative</span>&nbsp; <span class='diff-add'> // number when a is less, and a positive number otherwise.</span>&nbsp; <span class='diff-add'> var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };</span>&nbsp; <span class='diff-add'> function copyPos(x) {return Pos(x.line, x.ch);}</span>&nbsp; <span class='diff-add'> function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }</span>&nbsp; <span class='diff-add'> function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }</span>&nbsp; <span class='diff-add'> // SELECTION / CURSOR</span>&nbsp; <span class='diff-add'> // Selection objects are immutable. A new one is created every time</span>&nbsp; <span class='diff-add'> // the selection changes. A selection is one or more non-overlapping</span>&nbsp; <span class='diff-add'> // (and non-touching) ranges, sorted, and an integer that indicates</span>&nbsp; <span class='diff-add'> // which one is the primary selection (the one that's scrolled into</span>&nbsp; <span class='diff-add'> // view, that getCursor returns, etc).</span>&nbsp; <span class='diff-add'> function Selection(ranges, primIndex) {</span>&nbsp; <span class='diff-add'> this.ranges = ranges;</span>&nbsp; <span class='diff-add'> this.primIndex = primIndex;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> Selection.prototype = {</span>&nbsp; <span class='diff-add'> primary: function() { return this.ranges[this.primIndex]; },</span>&nbsp; <span class='diff-add'> equals: function(other) {</span>&nbsp; <span class='diff-add'> if (other == this) return true;</span>&nbsp; <span class='diff-add'> if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var here = this.ranges[i], there = other.ranges[i];</span>&nbsp; <span class='diff-add'> if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> deepCopy: function() {</span>&nbsp; <span class='diff-add'> for (var out = [], i = 0; i < this.ranges.length; i++)</span>&nbsp; <span class='diff-add'> out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));</span>&nbsp; <span class='diff-add'> return new Selection(out, this.primIndex);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> somethingSelected: function() {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.ranges.length; i++)</span>&nbsp; <span class='diff-add'> if (!this.ranges[i].empty()) return true;</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> contains: function(pos, end) {</span>&nbsp; <span class='diff-add'> if (!end) end = pos;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var range = this.ranges[i];</span>&nbsp; <span class='diff-add'> if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)</span>&nbsp; <span class='diff-add'> return i;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return -1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function Range(anchor, head) {</span>&nbsp; <span class='diff-add'> this.anchor = anchor; this.head = head;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> Range.prototype = {</span>&nbsp; <span class='diff-add'> from: function() { return minPos(this.anchor, this.head); },</span>&nbsp; <span class='diff-add'> to: function() { return maxPos(this.anchor, this.head); },</span>&nbsp; <span class='diff-add'> empty: function() {</span>&nbsp; <span class='diff-add'> return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Take an unsorted, potentially overlapping set of ranges, and</span>&nbsp; <span class='diff-add'> // build a selection out of it. 'Consumes' ranges array (modifying</span>&nbsp; <span class='diff-add'> // it).</span>&nbsp; <span class='diff-add'> function normalizeSelection(ranges, primIndex) {</span>&nbsp; <span class='diff-add'> var prim = ranges[primIndex];</span>&nbsp; <span class='diff-add'> ranges.sort(function(a, b) { return cmp(a.from(), b.from()); });</span>&nbsp; <span class='diff-add'> primIndex = indexOf(ranges, prim);</span>&nbsp; <span class='diff-add'> for (var i = 1; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var cur = ranges[i], prev = ranges[i - 1];</span>&nbsp; <span class='diff-add'> if (cmp(prev.to(), cur.from()) >= 0) {</span>&nbsp; <span class='diff-add'> var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());</span>&nbsp; <span class='diff-add'> var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;</span>&nbsp; <span class='diff-add'> if (i <= primIndex) --primIndex;</span>&nbsp; <span class='diff-add'> ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return new Selection(ranges, primIndex);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function simpleSelection(anchor, head) {</span>&nbsp; <span class='diff-add'> return new Selection([new Range(anchor, head || anchor)], 0);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Most of the external API clips given positions to make sure they</span>&nbsp; <span class='diff-add'> // actually exist within the document.</span>&nbsp; <span class='diff-add'> function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}</span>&nbsp; <span class='diff-add'> function clipPos(doc, pos) {</span>&nbsp; <span class='diff-add'> if (pos.line < doc.first) return Pos(doc.first, 0);</span>&nbsp; <span class='diff-add'> var last = doc.first + doc.size - 1;</span>&nbsp; <span class='diff-add'> if (pos.line > last) return Pos(last, getLine(doc, last).text.length);</span>&nbsp; <span class='diff-add'> return clipToLen(pos, getLine(doc, pos.line).text.length);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function clipToLen(pos, linelen) {</span>&nbsp; <span class='diff-add'> var ch = pos.ch;</span>&nbsp; <span class='diff-add'> if (ch == null || ch > linelen) return Pos(pos.line, linelen);</span>&nbsp; <span class='diff-add'> else if (ch < 0) return Pos(pos.line, 0);</span>&nbsp; <span class='diff-add'> else return pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}</span>&nbsp; <span class='diff-add'> function clipPosArray(doc, array) {</span>&nbsp; <span class='diff-add'> for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);</span>&nbsp; <span class='diff-add'> return out;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // SELECTION UPDATES</span>&nbsp; <span class='diff-add'> // The 'scroll' parameter given to many of these indicated whether</span>&nbsp; <span class='diff-add'> // the new cursor position should be scrolled into view after</span>&nbsp; <span class='diff-add'> // modifying the selection.</span>&nbsp; <span class='diff-add'> // If shift is held or the extend flag is set, extends a range to</span>&nbsp; <span class='diff-add'> // include a given position (and optionally a second position).</span>&nbsp; <span class='diff-add'> // Otherwise, simply returns the range between the given positions.</span>&nbsp; <span class='diff-add'> // Used for cursor motion and such.</span>&nbsp; <span class='diff-add'> function extendRange(doc, range, head, other) {</span>&nbsp; <span class='diff-add'> if (doc.cm && doc.cm.display.shift || doc.extend) {</span>&nbsp; <span class='diff-add'> var anchor = range.anchor;</span>&nbsp; <span class='diff-add'> if (other) {</span>&nbsp; <span class='diff-add'> var posBefore = cmp(head, anchor) < 0;</span>&nbsp; <span class='diff-add'> if (posBefore != (cmp(other, anchor) < 0)) {</span>&nbsp; <span class='diff-add'> anchor = head;</span>&nbsp; <span class='diff-add'> head = other;</span>&nbsp; <span class='diff-add'> } else if (posBefore != (cmp(head, other) < 0)) {</span>&nbsp; <span class='diff-add'> head = other;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return new Range(anchor, head);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return new Range(other || head, head);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Extend the primary selection range, discard the rest.</span>&nbsp; <span class='diff-add'> function extendSelection(doc, head, other, options) {</span>&nbsp; <span class='diff-add'> setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Extend all selections (pos is an array of selections with length</span>&nbsp; <span class='diff-add'> // equal the number of selections)</span>&nbsp; <span class='diff-add'> function extendSelections(doc, heads, options) {</span>&nbsp; <span class='diff-add'> for (var out = [], i = 0; i < doc.sel.ranges.length; i++)</span>&nbsp; <span class='diff-add'> out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);</span>&nbsp; <span class='diff-add'> var newSel = normalizeSelection(out, doc.sel.primIndex);</span>&nbsp; <span class='diff-add'> setSelection(doc, newSel, options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Updates a single range in the selection.</span>&nbsp; <span class='diff-add'> function replaceOneSelection(doc, i, range, options) {</span>&nbsp; <span class='diff-add'> var ranges = doc.sel.ranges.slice(0);</span>&nbsp; <span class='diff-add'> ranges[i] = range;</span>&nbsp; <span class='diff-add'> setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Reset the selection to a single range.</span>&nbsp; <span class='diff-add'> function setSimpleSelection(doc, anchor, head, options) {</span>&nbsp; <span class='diff-add'> setSelection(doc, simpleSelection(anchor, head), options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Give beforeSelectionChange handlers a change to influence a</span>&nbsp; <span class='diff-add'> // selection update.</span>&nbsp; <span class='diff-add'> function filterSelectionChange(doc, sel) {</span>&nbsp; <span class='diff-add'> var obj = {</span>&nbsp; <span class='diff-add'> ranges: sel.ranges,</span>&nbsp; <span class='diff-add'> update: function(ranges) {</span>&nbsp; <span class='diff-add'> this.ranges = [];</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++)</span>&nbsp; <span class='diff-add'> this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),</span>&nbsp; <span class='diff-add'> clipPos(doc, ranges[i].head));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> signal(doc, "beforeSelectionChange", doc, obj);</span>&nbsp; <span class='diff-add'> if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj);</span>&nbsp; <span class='diff-add'> if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1);</span>&nbsp; <span class='diff-add'> else return sel;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function setSelectionReplaceHistory(doc, sel, options) {</span>&nbsp; <span class='diff-add'> var done = doc.history.done, last = lst(done);</span>&nbsp; <span class='diff-add'> if (last && last.ranges) {</span>&nbsp; <span class='diff-add'> done[done.length - 1] = sel;</span>&nbsp; <span class='diff-add'> setSelectionNoUndo(doc, sel, options);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> setSelection(doc, sel, options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Set a new selection.</span>&nbsp; <span class='diff-add'> function setSelection(doc, sel, options) {</span>&nbsp; <span class='diff-add'> setSelectionNoUndo(doc, sel, options);</span>&nbsp; <span class='diff-add'> addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function setSelectionNoUndo(doc, sel, options) {</span>&nbsp; <span class='diff-add'> if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))</span>&nbsp; <span class='diff-add'> sel = filterSelectionChange(doc, sel);</span>&nbsp; <span class='diff-add'> var bias = options && options.bias ||</span>&nbsp; <span class='diff-add'> (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);</span>&nbsp; <span class='diff-add'> setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));</span>&nbsp; <span class='diff-add'> if (!(options && options.scroll === false) && doc.cm)</span>&nbsp; <span class='diff-add'> ensureCursorVisible(doc.cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function setSelectionInner(doc, sel) {</span>&nbsp; <span class='diff-add'> if (sel.equals(doc.sel)) return;</span>&nbsp; <span class='diff-add'> doc.sel = sel;</span>&nbsp; <span class='diff-add'> if (doc.cm) {</span>&nbsp; <span class='diff-add'> doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;</span>&nbsp; <span class='diff-add'> signalCursorActivity(doc.cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> signalLater(doc, "cursorActivity", doc);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Verify that the selection does not partially select any atomic</span>&nbsp; <span class='diff-add'> // marked ranges.</span>&nbsp; <span class='diff-add'> function reCheckSelection(doc) {</span>&nbsp; <span class='diff-add'> setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Return a selection that does not partially select any atomic</span>&nbsp; <span class='diff-add'> // ranges.</span>&nbsp; <span class='diff-add'> function skipAtomicInSelection(doc, sel, bias, mayClear) {</span>&nbsp; <span class='diff-add'> var out;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < sel.ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var range = sel.ranges[i];</span>&nbsp; <span class='diff-add'> var newAnchor = skipAtomic(doc, range.anchor, bias, mayClear);</span>&nbsp; <span class='diff-add'> var newHead = skipAtomic(doc, range.head, bias, mayClear);</span>&nbsp; <span class='diff-add'> if (out || newAnchor != range.anchor || newHead != range.head) {</span>&nbsp; <span class='diff-add'> if (!out) out = sel.ranges.slice(0, i);</span>&nbsp; <span class='diff-add'> out[i] = new Range(newAnchor, newHead);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return out ? normalizeSelection(out, sel.primIndex) : sel;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Ensure a given position is not inside an atomic range.</span>&nbsp; <span class='diff-add'> function skipAtomic(doc, pos, bias, mayClear) {</span>&nbsp; <span class='diff-add'> var flipped = false, curPos = pos;</span>&nbsp; <span class='diff-add'> var dir = bias || 1;</span>&nbsp; <span class='diff-add'> doc.cantEdit = false;</span>&nbsp; <span class='diff-add'> search: for (;;) {</span>&nbsp; <span class='diff-add'> var line = getLine(doc, curPos.line);</span>&nbsp; <span class='diff-add'> if (line.markedSpans) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < line.markedSpans.length; ++i) {</span>&nbsp; <span class='diff-add'> var sp = line.markedSpans[i], m = sp.marker;</span>&nbsp; <span class='diff-add'> if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) &&</span>&nbsp; <span class='diff-add'> (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) {</span>&nbsp; <span class='diff-add'> if (mayClear) {</span>&nbsp; <span class='diff-add'> signal(m, "beforeCursorEnter");</span>&nbsp; <span class='diff-add'> if (m.explicitlyCleared) {</span>&nbsp; <span class='diff-add'> if (!line.markedSpans) break;</span>&nbsp; <span class='diff-add'> else {--i; continue;}</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!m.atomic) continue;</span>&nbsp; <span class='diff-add'> var newPos = m.find(dir < 0 ? -1 : 1);</span>&nbsp; <span class='diff-add'> if (cmp(newPos, curPos) == 0) {</span>&nbsp; <span class='diff-add'> newPos.ch += dir;</span>&nbsp; <span class='diff-add'> if (newPos.ch < 0) {</span>&nbsp; <span class='diff-add'> if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1));</span>&nbsp; <span class='diff-add'> else newPos = null;</span>&nbsp; <span class='diff-add'> } else if (newPos.ch > line.text.length) {</span>&nbsp; <span class='diff-add'> if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0);</span>&nbsp; <span class='diff-add'> else newPos = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!newPos) {</span>&nbsp; <span class='diff-add'> if (flipped) {</span>&nbsp; <span class='diff-add'> // Driven in a corner -- no valid cursor position found at all</span>&nbsp; <span class='diff-add'> // -- try again *with* clearing, if we didn't already</span>&nbsp; <span class='diff-add'> if (!mayClear) return skipAtomic(doc, pos, bias, true);</span>&nbsp; <span class='diff-add'> // Otherwise, turn off editing until further notice, and return the start of the doc</span>&nbsp; <span class='diff-add'> doc.cantEdit = true;</span>&nbsp; <span class='diff-add'> return Pos(doc.first, 0);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> flipped = true; newPos = pos; dir = -dir;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> curPos = newPos;</span>&nbsp; <span class='diff-add'> continue search;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return curPos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // SELECTION DRAWING</span>&nbsp; <span class='diff-add'> // Redraw the selection and/or cursor</span>&nbsp; <span class='diff-add'> function drawSelection(cm) {</span>&nbsp; <span class='diff-add'> var display = cm.display, doc = cm.doc, result = {};</span>&nbsp; <span class='diff-add'> var curFragment = result.cursors = document.createDocumentFragment();</span>&nbsp; <span class='diff-add'> var selFragment = result.selection = document.createDocumentFragment();</span>&nbsp; <span class='diff-add'> for (var i = 0; i < doc.sel.ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var range = doc.sel.ranges[i];</span>&nbsp; <span class='diff-add'> var collapsed = range.empty();</span>&nbsp; <span class='diff-add'> if (collapsed || cm.options.showCursorWhenSelecting)</span>&nbsp; <span class='diff-add'> drawSelectionCursor(cm, range, curFragment);</span>&nbsp; <span class='diff-add'> if (!collapsed)</span>&nbsp; <span class='diff-add'> drawSelectionRange(cm, range, selFragment);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Move the hidden textarea near the cursor to prevent scrolling artifacts</span>&nbsp; <span class='diff-add'> if (cm.options.moveInputWithCursor) {</span>&nbsp; <span class='diff-add'> var headPos = cursorCoords(cm, doc.sel.primary().head, "div");</span>&nbsp; <span class='diff-add'> var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,</span>&nbsp; <span class='diff-add'> headPos.top + lineOff.top - wrapOff.top));</span>&nbsp; <span class='diff-add'> result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,</span>&nbsp; <span class='diff-add'> headPos.left + lineOff.left - wrapOff.left));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function showSelection(cm, drawn) {</span>&nbsp; <span class='diff-add'> removeChildrenAndAdd(cm.display.cursorDiv, drawn.cursors);</span>&nbsp; <span class='diff-add'> removeChildrenAndAdd(cm.display.selectionDiv, drawn.selection);</span>&nbsp; <span class='diff-add'> if (drawn.teTop != null) {</span>&nbsp; <span class='diff-add'> cm.display.inputDiv.style.top = drawn.teTop + "px";</span>&nbsp; <span class='diff-add'> cm.display.inputDiv.style.left = drawn.teLeft + "px";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function updateSelection(cm) {</span>&nbsp; <span class='diff-add'> showSelection(cm, drawSelection(cm));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Draws a cursor for the given range</span>&nbsp; <span class='diff-add'> function drawSelectionCursor(cm, range, output) {</span>&nbsp; <span class='diff-add'> var pos = cursorCoords(cm, range.head, "div", null, null, !cm.options.singleCursorHeightPerLine);</span>&nbsp; <span class='diff-add'> var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));</span>&nbsp; <span class='diff-add'> cursor.style.left = pos.left + "px";</span>&nbsp; <span class='diff-add'> cursor.style.top = pos.top + "px";</span>&nbsp; <span class='diff-add'> cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";</span>&nbsp; <span class='diff-add'> if (pos.other) {</span>&nbsp; <span class='diff-add'> // Secondary cursor, shown when on a 'jump' in bi-directional text</span>&nbsp; <span class='diff-add'> var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"));</span>&nbsp; <span class='diff-add'> otherCursor.style.display = "";</span>&nbsp; <span class='diff-add'> otherCursor.style.left = pos.other.left + "px";</span>&nbsp; <span class='diff-add'> otherCursor.style.top = pos.other.top + "px";</span>&nbsp; <span class='diff-add'> otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Draws the given range as a highlighted selection</span>&nbsp; <span class='diff-add'> function drawSelectionRange(cm, range, output) {</span>&nbsp; <span class='diff-add'> var display = cm.display, doc = cm.doc;</span>&nbsp; <span class='diff-add'> var fragment = document.createDocumentFragment();</span>&nbsp; <span class='diff-add'> var padding = paddingH(cm.display), leftSide = padding.left;</span>&nbsp; <span class='diff-add'> var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;</span>&nbsp; <span class='diff-add'> function add(left, top, width, bottom) {</span>&nbsp; <span class='diff-add'> if (top < 0) top = 0;</span>&nbsp; <span class='diff-add'> top = Math.round(top);</span>&nbsp; <span class='diff-add'> bottom = Math.round(bottom);</span>&nbsp; <span class='diff-add'> fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +</span>&nbsp; <span class='diff-add'> "px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) +</span>&nbsp; <span class='diff-add'> "px; height: " + (bottom - top) + "px"));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function drawForLine(line, fromArg, toArg) {</span>&nbsp; <span class='diff-add'> var lineObj = getLine(doc, line);</span>&nbsp; <span class='diff-add'> var lineLen = lineObj.text.length;</span>&nbsp; <span class='diff-add'> var start, end;</span>&nbsp; <span class='diff-add'> function coords(ch, bias) {</span>&nbsp; <span class='diff-add'> return charCoords(cm, Pos(line, ch), "div", lineObj, bias);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {</span>&nbsp; <span class='diff-add'> var leftPos = coords(from, "left"), rightPos, left, right;</span>&nbsp; <span class='diff-add'> if (from == to) {</span>&nbsp; <span class='diff-add'> rightPos = leftPos;</span>&nbsp; <span class='diff-add'> left = right = leftPos.left;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> rightPos = coords(to - 1, "right");</span>&nbsp; <span class='diff-add'> if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }</span>&nbsp; <span class='diff-add'> left = leftPos.left;</span>&nbsp; <span class='diff-add'> right = rightPos.right;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (fromArg == null && from == 0) left = leftSide;</span>&nbsp; <span class='diff-add'> if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part</span>&nbsp; <span class='diff-add'> add(left, leftPos.top, null, leftPos.bottom);</span>&nbsp; <span class='diff-add'> left = leftSide;</span>&nbsp; <span class='diff-add'> if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (toArg == null && to == lineLen) right = rightSide;</span>&nbsp; <span class='diff-add'> if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)</span>&nbsp; <span class='diff-add'> start = leftPos;</span>&nbsp; <span class='diff-add'> if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)</span>&nbsp; <span class='diff-add'> end = rightPos;</span>&nbsp; <span class='diff-add'> if (left < leftSide + 1) left = leftSide;</span>&nbsp; <span class='diff-add'> add(left, rightPos.top, right - left, rightPos.bottom);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return {start: start, end: end};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var sFrom = range.from(), sTo = range.to();</span>&nbsp; <span class='diff-add'> if (sFrom.line == sTo.line) {</span>&nbsp; <span class='diff-add'> drawForLine(sFrom.line, sFrom.ch, sTo.ch);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);</span>&nbsp; <span class='diff-add'> var singleVLine = visualLine(fromLine) == visualLine(toLine);</span>&nbsp; <span class='diff-add'> var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;</span>&nbsp; <span class='diff-add'> var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;</span>&nbsp; <span class='diff-add'> if (singleVLine) {</span>&nbsp; <span class='diff-add'> if (leftEnd.top < rightStart.top - 2) {</span>&nbsp; <span class='diff-add'> add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);</span>&nbsp; <span class='diff-add'> add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (leftEnd.bottom < rightStart.top)</span>&nbsp; <span class='diff-add'> add(leftSide, leftEnd.bottom, null, rightStart.top);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> output.appendChild(fragment);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Cursor-blinking</span>&nbsp; <span class='diff-add'> function restartBlink(cm) {</span>&nbsp; <span class='diff-add'> if (!cm.state.focused) return;</span>&nbsp; <span class='diff-add'> var display = cm.display;</span>&nbsp; <span class='diff-add'> clearInterval(display.blinker);</span>&nbsp; <span class='diff-add'> var on = true;</span>&nbsp; <span class='diff-add'> display.cursorDiv.style.visibility = "";</span>&nbsp; <span class='diff-add'> if (cm.options.cursorBlinkRate > 0)</span>&nbsp; <span class='diff-add'> display.blinker = setInterval(function() {</span>&nbsp; <span class='diff-add'> display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden";</span>&nbsp; <span class='diff-add'> }, cm.options.cursorBlinkRate);</span>&nbsp; <span class='diff-add'> else if (cm.options.cursorBlinkRate < 0)</span>&nbsp; <span class='diff-add'> display.cursorDiv.style.visibility = "hidden";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // HIGHLIGHT WORKER</span>&nbsp; <span class='diff-add'> function startWorker(cm, time) {</span>&nbsp; <span class='diff-add'> if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)</span>&nbsp; <span class='diff-add'> cm.state.highlight.set(time, bind(highlightWorker, cm));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function highlightWorker(cm) {</span>&nbsp; <span class='diff-add'> var doc = cm.doc;</span>&nbsp; <span class='diff-add'> if (doc.frontier < doc.first) doc.frontier = doc.first;</span>&nbsp; <span class='diff-add'> if (doc.frontier >= cm.display.viewTo) return;</span>&nbsp; <span class='diff-add'> var end = +new Date + cm.options.workTime;</span>&nbsp; <span class='diff-add'> var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));</span>&nbsp; <span class='diff-add'> var changedLines = [];</span>&nbsp; <span class='diff-add'> doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {</span>&nbsp; <span class='diff-add'> if (doc.frontier >= cm.display.viewFrom) { // Visible</span>&nbsp; <span class='diff-add'> var oldStyles = line.styles;</span>&nbsp; <span class='diff-add'> var highlighted = highlightLine(cm, line, state, true);</span>&nbsp; <span class='diff-add'> line.styles = highlighted.styles;</span>&nbsp; <span class='diff-add'> var oldCls = line.styleClasses, newCls = highlighted.classes;</span>&nbsp; <span class='diff-add'> if (newCls) line.styleClasses = newCls;</span>&nbsp; <span class='diff-add'> else if (oldCls) line.styleClasses = null;</span>&nbsp; <span class='diff-add'> var ischange = !oldStyles || oldStyles.length != line.styles.length ||</span>&nbsp; <span class='diff-add'> oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);</span>&nbsp; <span class='diff-add'> for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];</span>&nbsp; <span class='diff-add'> if (ischange) changedLines.push(doc.frontier);</span>&nbsp; <span class='diff-add'> line.stateAfter = copyState(doc.mode, state);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> processLine(cm, line.text, state);</span>&nbsp; <span class='diff-add'> line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ++doc.frontier;</span>&nbsp; <span class='diff-add'> if (+new Date > end) {</span>&nbsp; <span class='diff-add'> startWorker(cm, cm.options.workDelay);</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (changedLines.length) runInOp(cm, function() {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < changedLines.length; i++)</span>&nbsp; <span class='diff-add'> regLineChange(cm, changedLines[i], "text");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Finds the line to start with when starting a parse. Tries to</span>&nbsp; <span class='diff-add'> // find a line with a stateAfter, so that it can start with a</span>&nbsp; <span class='diff-add'> // valid state. If that fails, it returns the line with the</span>&nbsp; <span class='diff-add'> // smallest indentation, which tends to need the least context to</span>&nbsp; <span class='diff-add'> // parse correctly.</span>&nbsp; <span class='diff-add'> function findStartLine(cm, n, precise) {</span>&nbsp; <span class='diff-add'> var minindent, minline, doc = cm.doc;</span>&nbsp; <span class='diff-add'> var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);</span>&nbsp; <span class='diff-add'> for (var search = n; search > lim; --search) {</span>&nbsp; <span class='diff-add'> if (search <= doc.first) return doc.first;</span>&nbsp; <span class='diff-add'> var line = getLine(doc, search - 1);</span>&nbsp; <span class='diff-add'> if (line.stateAfter && (!precise || search <= doc.frontier)) return search;</span>&nbsp; <span class='diff-add'> var indented = countColumn(line.text, null, cm.options.tabSize);</span>&nbsp; <span class='diff-add'> if (minline == null || minindent > indented) {</span>&nbsp; <span class='diff-add'> minline = search - 1;</span>&nbsp; <span class='diff-add'> minindent = indented;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return minline;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function getStateBefore(cm, n, precise) {</span>&nbsp; <span class='diff-add'> var doc = cm.doc, display = cm.display;</span>&nbsp; <span class='diff-add'> if (!doc.mode.startState) return true;</span>&nbsp; <span class='diff-add'> var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;</span>&nbsp; <span class='diff-add'> if (!state) state = startState(doc.mode);</span>&nbsp; <span class='diff-add'> else state = copyState(doc.mode, state);</span>&nbsp; <span class='diff-add'> doc.iter(pos, n, function(line) {</span>&nbsp; <span class='diff-add'> processLine(cm, line.text, state);</span>&nbsp; <span class='diff-add'> var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;</span>&nbsp; <span class='diff-add'> line.stateAfter = save ? copyState(doc.mode, state) : null;</span>&nbsp; <span class='diff-add'> ++pos;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (precise) doc.frontier = pos;</span>&nbsp; <span class='diff-add'> return state;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // POSITION MEASUREMENT</span>&nbsp; <span class='diff-add'> function paddingTop(display) {return display.lineSpace.offsetTop;}</span>&nbsp; <span class='diff-add'> function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}</span>&nbsp; <span class='diff-add'> function paddingH(display) {</span>&nbsp; <span class='diff-add'> if (display.cachedPaddingH) return display.cachedPaddingH;</span>&nbsp; <span class='diff-add'> var e = removeChildrenAndAdd(display.measure, elt("pre", "x"));</span>&nbsp; <span class='diff-add'> var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;</span>&nbsp; <span class='diff-add'> var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};</span>&nbsp; <span class='diff-add'> if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;</span>&nbsp; <span class='diff-add'> return data;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth; }</span>&nbsp; <span class='diff-add'> function displayWidth(cm) {</span>&nbsp; <span class='diff-add'> return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function displayHeight(cm) {</span>&nbsp; <span class='diff-add'> return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Ensure the lineView.wrapping.heights array is populated. This is</span>&nbsp; <span class='diff-add'> // an array of bottom offsets for the lines that make up a drawn</span>&nbsp; <span class='diff-add'> // line. When lineWrapping is on, there might be more than one</span>&nbsp; <span class='diff-add'> // height.</span>&nbsp; <span class='diff-add'> function ensureLineHeights(cm, lineView, rect) {</span>&nbsp; <span class='diff-add'> var wrapping = cm.options.lineWrapping;</span>&nbsp; <span class='diff-add'> var curWidth = wrapping && displayWidth(cm);</span>&nbsp; <span class='diff-add'> if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {</span>&nbsp; <span class='diff-add'> var heights = lineView.measure.heights = [];</span>&nbsp; <span class='diff-add'> if (wrapping) {</span>&nbsp; <span class='diff-add'> lineView.measure.width = curWidth;</span>&nbsp; <span class='diff-add'> var rects = lineView.text.firstChild.getClientRects();</span>&nbsp; <span class='diff-add'> for (var i = 0; i < rects.length - 1; i++) {</span>&nbsp; <span class='diff-add'> var cur = rects[i], next = rects[i + 1];</span>&nbsp; <span class='diff-add'> if (Math.abs(cur.bottom - next.bottom) > 2)</span>&nbsp; <span class='diff-add'> heights.push((cur.bottom + next.top) / 2 - rect.top);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> heights.push(rect.bottom - rect.top);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Find a line map (mapping character offsets to text nodes) and a</span>&nbsp; <span class='diff-add'> // measurement cache for the given line number. (A line view might</span>&nbsp; <span class='diff-add'> // contain multiple lines when collapsed ranges are present.)</span>&nbsp; <span class='diff-add'> function mapFromLineView(lineView, line, lineN) {</span>&nbsp; <span class='diff-add'> if (lineView.line == line)</span>&nbsp; <span class='diff-add'> return {map: lineView.measure.map, cache: lineView.measure.cache};</span>&nbsp; <span class='diff-add'> for (var i = 0; i < lineView.rest.length; i++)</span>&nbsp; <span class='diff-add'> if (lineView.rest[i] == line)</span>&nbsp; <span class='diff-add'> return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]};</span>&nbsp; <span class='diff-add'> for (var i = 0; i < lineView.rest.length; i++)</span>&nbsp; <span class='diff-add'> if (lineNo(lineView.rest[i]) > lineN)</span>&nbsp; <span class='diff-add'> return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Render a line into the hidden node display.externalMeasured. Used</span>&nbsp; <span class='diff-add'> // when measurement is needed for a line that's not in the viewport.</span>&nbsp; <span class='diff-add'> function updateExternalMeasurement(cm, line) {</span>&nbsp; <span class='diff-add'> line = visualLine(line);</span>&nbsp; <span class='diff-add'> var lineN = lineNo(line);</span>&nbsp; <span class='diff-add'> var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);</span>&nbsp; <span class='diff-add'> view.lineN = lineN;</span>&nbsp; <span class='diff-add'> var built = view.built = buildLineContent(cm, view);</span>&nbsp; <span class='diff-add'> view.text = built.pre;</span>&nbsp; <span class='diff-add'> removeChildrenAndAdd(cm.display.lineMeasure, built.pre);</span>&nbsp; <span class='diff-add'> return view;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Get a {top, bottom, left, right} box (in line-local coordinates)</span>&nbsp; <span class='diff-add'> // for a given character.</span>&nbsp; <span class='diff-add'> function measureChar(cm, line, ch, bias) {</span>&nbsp; <span class='diff-add'> return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Find a line view that corresponds to the given line number.</span>&nbsp; <span class='diff-add'> function findViewForLine(cm, lineN) {</span>&nbsp; <span class='diff-add'> if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)</span>&nbsp; <span class='diff-add'> return cm.display.view[findViewIndex(cm, lineN)];</span>&nbsp; <span class='diff-add'> var ext = cm.display.externalMeasured;</span>&nbsp; <span class='diff-add'> if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)</span>&nbsp; <span class='diff-add'> return ext;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Measurement can be split in two steps, the set-up work that</span>&nbsp; <span class='diff-add'> // applies to the whole line, and the measurement of the actual</span>&nbsp; <span class='diff-add'> // character. Functions like coordsChar, that need to do a lot of</span>&nbsp; <span class='diff-add'> // measurements in a row, can thus ensure that the set-up work is</span>&nbsp; <span class='diff-add'> // only done once.</span>&nbsp; <span class='diff-add'> function prepareMeasureForLine(cm, line) {</span>&nbsp; <span class='diff-add'> var lineN = lineNo(line);</span>&nbsp; <span class='diff-add'> var view = findViewForLine(cm, lineN);</span>&nbsp; <span class='diff-add'> if (view && !view.text)</span>&nbsp; <span class='diff-add'> view = null;</span>&nbsp; <span class='diff-add'> else if (view && view.changes)</span>&nbsp; <span class='diff-add'> updateLineForChanges(cm, view, lineN, getDimensions(cm));</span>&nbsp; <span class='diff-add'> if (!view)</span>&nbsp; <span class='diff-add'> view = updateExternalMeasurement(cm, line);</span>&nbsp; <span class='diff-add'> var info = mapFromLineView(view, line, lineN);</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> line: line, view: view, rect: null,</span>&nbsp; <span class='diff-add'> map: info.map, cache: info.cache, before: info.before,</span>&nbsp; <span class='diff-add'> hasHeights: false</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Given a prepared measurement object, measures the position of an</span>&nbsp; <span class='diff-add'> // actual character (or fetches it from the cache).</span>&nbsp; <span class='diff-add'> function measureCharPrepared(cm, prepared, ch, bias, varHeight) {</span>&nbsp; <span class='diff-add'> if (prepared.before) ch = -1;</span>&nbsp; <span class='diff-add'> var key = ch + (bias || ""), found;</span>&nbsp; <span class='diff-add'> if (prepared.cache.hasOwnProperty(key)) {</span>&nbsp; <span class='diff-add'> found = prepared.cache[key];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> if (!prepared.rect)</span>&nbsp; <span class='diff-add'> prepared.rect = prepared.view.text.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> if (!prepared.hasHeights) {</span>&nbsp; <span class='diff-add'> ensureLineHeights(cm, prepared.view, prepared.rect);</span>&nbsp; <span class='diff-add'> prepared.hasHeights = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> found = measureCharInner(cm, prepared, ch, bias);</span>&nbsp; <span class='diff-add'> if (!found.bogus) prepared.cache[key] = found;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {left: found.left, right: found.right,</span>&nbsp; <span class='diff-add'> top: varHeight ? found.rtop : found.top,</span>&nbsp; <span class='diff-add'> bottom: varHeight ? found.rbottom : found.bottom};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var nullRect = {left: 0, right: 0, top: 0, bottom: 0};</span>&nbsp; <span class='diff-add'> function measureCharInner(cm, prepared, ch, bias) {</span>&nbsp; <span class='diff-add'> var map = prepared.map;</span>&nbsp; <span class='diff-add'> var node, start, end, collapse;</span>&nbsp; <span class='diff-add'> // First, search the line map for the text node corresponding to,</span>&nbsp; <span class='diff-add'> // or closest to, the target character.</span>&nbsp; <span class='diff-add'> for (var i = 0; i < map.length; i += 3) {</span>&nbsp; <span class='diff-add'> var mStart = map[i], mEnd = map[i + 1];</span>&nbsp; <span class='diff-add'> if (ch < mStart) {</span>&nbsp; <span class='diff-add'> start = 0; end = 1;</span>&nbsp; <span class='diff-add'> collapse = "left";</span>&nbsp; <span class='diff-add'> } else if (ch < mEnd) {</span>&nbsp; <span class='diff-add'> start = ch - mStart;</span>&nbsp; <span class='diff-add'> end = start + 1;</span>&nbsp; <span class='diff-add'> } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {</span>&nbsp; <span class='diff-add'> end = mEnd - mStart;</span>&nbsp; <span class='diff-add'> start = end - 1;</span>&nbsp; <span class='diff-add'> if (ch >= mEnd) collapse = "right";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (start != null) {</span>&nbsp; <span class='diff-add'> node = map[i + 2];</span>&nbsp; <span class='diff-add'> if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))</span>&nbsp; <span class='diff-add'> collapse = bias;</span>&nbsp; <span class='diff-add'> if (bias == "left" && start == 0)</span>&nbsp; <span class='diff-add'> while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {</span>&nbsp; <span class='diff-add'> node = map[(i -= 3) + 2];</span>&nbsp; <span class='diff-add'> collapse = "left";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bias == "right" && start == mEnd - mStart)</span>&nbsp; <span class='diff-add'> while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {</span>&nbsp; <span class='diff-add'> node = map[(i += 3) + 2];</span>&nbsp; <span class='diff-add'> collapse = "right";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var rect;</span>&nbsp; <span class='diff-add'> if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.</span>&nbsp; <span class='diff-add'> for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned</span>&nbsp; <span class='diff-add'> while (start && isExtendingChar(prepared.line.text.charAt(mStart + start))) --start;</span>&nbsp; <span class='diff-add'> while (mStart + end < mEnd && isExtendingChar(prepared.line.text.charAt(mStart + end))) ++end;</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 9 && start == 0 && end == mEnd - mStart) {</span>&nbsp; <span class='diff-add'> rect = node.parentNode.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> } else if (ie && cm.options.lineWrapping) {</span>&nbsp; <span class='diff-add'> var rects = range(node, start, end).getClientRects();</span>&nbsp; <span class='diff-add'> if (rects.length)</span>&nbsp; <span class='diff-add'> rect = rects[bias == "right" ? rects.length - 1 : 0];</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> rect = nullRect;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> rect = range(node, start, end).getBoundingClientRect() || nullRect;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (rect.left || rect.right || start == 0) break;</span>&nbsp; <span class='diff-add'> end = start;</span>&nbsp; <span class='diff-add'> start = start - 1;</span>&nbsp; <span class='diff-add'> collapse = "right";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect);</span>&nbsp; <span class='diff-add'> } else { // If it is a widget, simply get the box for the whole widget.</span>&nbsp; <span class='diff-add'> if (start > 0) collapse = bias = "right";</span>&nbsp; <span class='diff-add'> var rects;</span>&nbsp; <span class='diff-add'> if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)</span>&nbsp; <span class='diff-add'> rect = rects[bias == "right" ? rects.length - 1 : 0];</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> rect = node.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {</span>&nbsp; <span class='diff-add'> var rSpan = node.parentNode.getClientRects()[0];</span>&nbsp; <span class='diff-add'> if (rSpan)</span>&nbsp; <span class='diff-add'> rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom};</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> rect = nullRect;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;</span>&nbsp; <span class='diff-add'> var mid = (rtop + rbot) / 2;</span>&nbsp; <span class='diff-add'> var heights = prepared.view.measure.heights;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < heights.length - 1; i++)</span>&nbsp; <span class='diff-add'> if (mid < heights[i]) break;</span>&nbsp; <span class='diff-add'> var top = i ? heights[i - 1] : 0, bot = heights[i];</span>&nbsp; <span class='diff-add'> var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,</span>&nbsp; <span class='diff-add'> right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,</span>&nbsp; <span class='diff-add'> top: top, bottom: bot};</span>&nbsp; <span class='diff-add'> if (!rect.left && !rect.right) result.bogus = true;</span>&nbsp; <span class='diff-add'> if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Work around problem with bounding client rects on ranges being</span>&nbsp; <span class='diff-add'> // returned incorrectly when zoomed on IE10 and below.</span>&nbsp; <span class='diff-add'> function maybeUpdateRectForZooming(measure, rect) {</span>&nbsp; <span class='diff-add'> if (!window.screen || screen.logicalXDPI == null ||</span>&nbsp; <span class='diff-add'> screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))</span>&nbsp; <span class='diff-add'> return rect;</span>&nbsp; <span class='diff-add'> var scaleX = screen.logicalXDPI / screen.deviceXDPI;</span>&nbsp; <span class='diff-add'> var scaleY = screen.logicalYDPI / screen.deviceYDPI;</span>&nbsp; <span class='diff-add'> return {left: rect.left * scaleX, right: rect.right * scaleX,</span>&nbsp; <span class='diff-add'> top: rect.top * scaleY, bottom: rect.bottom * scaleY};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function clearLineMeasurementCacheFor(lineView) {</span>&nbsp; <span class='diff-add'> if (lineView.measure) {</span>&nbsp; <span class='diff-add'> lineView.measure.cache = {};</span>&nbsp; <span class='diff-add'> lineView.measure.heights = null;</span>&nbsp; <span class='diff-add'> if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)</span>&nbsp; <span class='diff-add'> lineView.measure.caches[i] = {};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function clearLineMeasurementCache(cm) {</span>&nbsp; <span class='diff-add'> cm.display.externalMeasure = null;</span>&nbsp; <span class='diff-add'> removeChildren(cm.display.lineMeasure);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < cm.display.view.length; i++)</span>&nbsp; <span class='diff-add'> clearLineMeasurementCacheFor(cm.display.view[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function clearCaches(cm) {</span>&nbsp; <span class='diff-add'> clearLineMeasurementCache(cm);</span>&nbsp; <span class='diff-add'> cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;</span>&nbsp; <span class='diff-add'> if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;</span>&nbsp; <span class='diff-add'> cm.display.lineNumChars = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }</span>&nbsp; <span class='diff-add'> function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }</span>&nbsp; <span class='diff-add'> // Converts a {top, bottom, left, right} box from line-local</span>&nbsp; <span class='diff-add'> // coordinates into another coordinate system. Context may be one of</span>&nbsp; <span class='diff-add'> // "line", "div" (display.lineDiv), "local"/null (editor), or "page".</span>&nbsp; <span class='diff-add'> function intoCoordSystem(cm, lineObj, rect, context) {</span>&nbsp; <span class='diff-add'> if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {</span>&nbsp; <span class='diff-add'> var size = widgetHeight(lineObj.widgets[i]);</span>&nbsp; <span class='diff-add'> rect.top += size; rect.bottom += size;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (context == "line") return rect;</span>&nbsp; <span class='diff-add'> if (!context) context = "local";</span>&nbsp; <span class='diff-add'> var yOff = heightAtLine(lineObj);</span>&nbsp; <span class='diff-add'> if (context == "local") yOff += paddingTop(cm.display);</span>&nbsp; <span class='diff-add'> else yOff -= cm.display.viewOffset;</span>&nbsp; <span class='diff-add'> if (context == "page" || context == "window") {</span>&nbsp; <span class='diff-add'> var lOff = cm.display.lineSpace.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> yOff += lOff.top + (context == "window" ? 0 : pageScrollY());</span>&nbsp; <span class='diff-add'> var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());</span>&nbsp; <span class='diff-add'> rect.left += xOff; rect.right += xOff;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> rect.top += yOff; rect.bottom += yOff;</span>&nbsp; <span class='diff-add'> return rect;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Coverts a box from "div" coords to another coordinate system.</span>&nbsp; <span class='diff-add'> // Context may be "window", "page", "div", or "local"/null.</span>&nbsp; <span class='diff-add'> function fromCoordSystem(cm, coords, context) {</span>&nbsp; <span class='diff-add'> if (context == "div") return coords;</span>&nbsp; <span class='diff-add'> var left = coords.left, top = coords.top;</span>&nbsp; <span class='diff-add'> // First move into "page" coordinate system</span>&nbsp; <span class='diff-add'> if (context == "page") {</span>&nbsp; <span class='diff-add'> left -= pageScrollX();</span>&nbsp; <span class='diff-add'> top -= pageScrollY();</span>&nbsp; <span class='diff-add'> } else if (context == "local" || !context) {</span>&nbsp; <span class='diff-add'> var localBox = cm.display.sizer.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> left += localBox.left;</span>&nbsp; <span class='diff-add'> top += localBox.top;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function charCoords(cm, pos, context, lineObj, bias) {</span>&nbsp; <span class='diff-add'> if (!lineObj) lineObj = getLine(cm.doc, pos.line);</span>&nbsp; <span class='diff-add'> return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Returns a box for a given cursor position, which may have an</span>&nbsp; <span class='diff-add'> // 'other' property containing the position of the secondary cursor</span>&nbsp; <span class='diff-add'> // on a bidi boundary.</span>&nbsp; <span class='diff-add'> function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {</span>&nbsp; <span class='diff-add'> lineObj = lineObj || getLine(cm.doc, pos.line);</span>&nbsp; <span class='diff-add'> if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj);</span>&nbsp; <span class='diff-add'> function get(ch, right) {</span>&nbsp; <span class='diff-add'> var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);</span>&nbsp; <span class='diff-add'> if (right) m.left = m.right; else m.right = m.left;</span>&nbsp; <span class='diff-add'> return intoCoordSystem(cm, lineObj, m, context);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function getBidi(ch, partPos) {</span>&nbsp; <span class='diff-add'> var part = order[partPos], right = part.level % 2;</span>&nbsp; <span class='diff-add'> if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {</span>&nbsp; <span class='diff-add'> part = order[--partPos];</span>&nbsp; <span class='diff-add'> ch = bidiRight(part) - (part.level % 2 ? 0 : 1);</span>&nbsp; <span class='diff-add'> right = true;</span>&nbsp; <span class='diff-add'> } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {</span>&nbsp; <span class='diff-add'> part = order[++partPos];</span>&nbsp; <span class='diff-add'> ch = bidiLeft(part) - part.level % 2;</span>&nbsp; <span class='diff-add'> right = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (right && ch == part.to && ch > part.from) return get(ch - 1);</span>&nbsp; <span class='diff-add'> return get(ch, right);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var order = getOrder(lineObj), ch = pos.ch;</span>&nbsp; <span class='diff-add'> if (!order) return get(ch);</span>&nbsp; <span class='diff-add'> var partPos = getBidiPartAt(order, ch);</span>&nbsp; <span class='diff-add'> var val = getBidi(ch, partPos);</span>&nbsp; <span class='diff-add'> if (bidiOther != null) val.other = getBidi(ch, bidiOther);</span>&nbsp; <span class='diff-add'> return val;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Used to cheaply estimate the coordinates for a position. Used for</span>&nbsp; <span class='diff-add'> // intermediate scroll updates.</span>&nbsp; <span class='diff-add'> function estimateCoords(cm, pos) {</span>&nbsp; <span class='diff-add'> var left = 0, pos = clipPos(cm.doc, pos);</span>&nbsp; <span class='diff-add'> if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch;</span>&nbsp; <span class='diff-add'> var lineObj = getLine(cm.doc, pos.line);</span>&nbsp; <span class='diff-add'> var top = heightAtLine(lineObj) + paddingTop(cm.display);</span>&nbsp; <span class='diff-add'> return {left: left, right: left, top: top, bottom: top + lineObj.height};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Positions returned by coordsChar contain some extra information.</span>&nbsp; <span class='diff-add'> // xRel is the relative x position of the input coordinates compared</span>&nbsp; <span class='diff-add'> // to the found position (so xRel > 0 means the coordinates are to</span>&nbsp; <span class='diff-add'> // the right of the character position, for example). When outside</span>&nbsp; <span class='diff-add'> // is true, that means the coordinates lie outside the line's</span>&nbsp; <span class='diff-add'> // vertical range.</span>&nbsp; <span class='diff-add'> function PosWithInfo(line, ch, outside, xRel) {</span>&nbsp; <span class='diff-add'> var pos = Pos(line, ch);</span>&nbsp; <span class='diff-add'> pos.xRel = xRel;</span>&nbsp; <span class='diff-add'> if (outside) pos.outside = true;</span>&nbsp; <span class='diff-add'> return pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Compute the character position closest to the given coordinates.</span>&nbsp; <span class='diff-add'> // Input must be lineSpace-local ("div" coordinate system).</span>&nbsp; <span class='diff-add'> function coordsChar(cm, x, y) {</span>&nbsp; <span class='diff-add'> var doc = cm.doc;</span>&nbsp; <span class='diff-add'> y += cm.display.viewOffset;</span>&nbsp; <span class='diff-add'> if (y < 0) return PosWithInfo(doc.first, 0, true, -1);</span>&nbsp; <span class='diff-add'> var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;</span>&nbsp; <span class='diff-add'> if (lineN > last)</span>&nbsp; <span class='diff-add'> return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);</span>&nbsp; <span class='diff-add'> if (x < 0) x = 0;</span>&nbsp; <span class='diff-add'> var lineObj = getLine(doc, lineN);</span>&nbsp; <span class='diff-add'> for (;;) {</span>&nbsp; <span class='diff-add'> var found = coordsCharInner(cm, lineObj, lineN, x, y);</span>&nbsp; <span class='diff-add'> var merged = collapsedSpanAtEnd(lineObj);</span>&nbsp; <span class='diff-add'> var mergedPos = merged && merged.find(0, true);</span>&nbsp; <span class='diff-add'> if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))</span>&nbsp; <span class='diff-add'> lineN = lineNo(lineObj = mergedPos.to.line);</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> return found;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function coordsCharInner(cm, lineObj, lineNo, x, y) {</span>&nbsp; <span class='diff-add'> var innerOff = y - heightAtLine(lineObj);</span>&nbsp; <span class='diff-add'> var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;</span>&nbsp; <span class='diff-add'> var preparedMeasure = prepareMeasureForLine(cm, lineObj);</span>&nbsp; <span class='diff-add'> function getX(ch) {</span>&nbsp; <span class='diff-add'> var sp = cursorCoords(cm, Pos(lineNo, ch), "line", lineObj, preparedMeasure);</span>&nbsp; <span class='diff-add'> wrongLine = true;</span>&nbsp; <span class='diff-add'> if (innerOff > sp.bottom) return sp.left - adjust;</span>&nbsp; <span class='diff-add'> else if (innerOff < sp.top) return sp.left + adjust;</span>&nbsp; <span class='diff-add'> else wrongLine = false;</span>&nbsp; <span class='diff-add'> return sp.left;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var bidi = getOrder(lineObj), dist = lineObj.text.length;</span>&nbsp; <span class='diff-add'> var from = lineLeft(lineObj), to = lineRight(lineObj);</span>&nbsp; <span class='diff-add'> var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;</span>&nbsp; <span class='diff-add'> if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);</span>&nbsp; <span class='diff-add'> // Do a binary search between these bounds.</span>&nbsp; <span class='diff-add'> for (;;) {</span>&nbsp; <span class='diff-add'> if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {</span>&nbsp; <span class='diff-add'> var ch = x < fromX || x - fromX <= toX - x ? from : to;</span>&nbsp; <span class='diff-add'> var xDiff = x - (ch == from ? fromX : toX);</span>&nbsp; <span class='diff-add'> while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;</span>&nbsp; <span class='diff-add'> var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,</span>&nbsp; <span class='diff-add'> xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);</span>&nbsp; <span class='diff-add'> return pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var step = Math.ceil(dist / 2), middle = from + step;</span>&nbsp; <span class='diff-add'> if (bidi) {</span>&nbsp; <span class='diff-add'> middle = from;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var middleX = getX(middle);</span>&nbsp; <span class='diff-add'> if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}</span>&nbsp; <span class='diff-add'> else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var measureText;</span>&nbsp; <span class='diff-add'> // Compute the default text height.</span>&nbsp; <span class='diff-add'> function textHeight(display) {</span>&nbsp; <span class='diff-add'> if (display.cachedTextHeight != null) return display.cachedTextHeight;</span>&nbsp; <span class='diff-add'> if (measureText == null) {</span>&nbsp; <span class='diff-add'> measureText = elt("pre");</span>&nbsp; <span class='diff-add'> // Measure a bunch of lines, for browsers that compute</span>&nbsp; <span class='diff-add'> // fractional heights.</span>&nbsp; <span class='diff-add'> for (var i = 0; i < 49; ++i) {</span>&nbsp; <span class='diff-add'> measureText.appendChild(document.createTextNode("x"));</span>&nbsp; <span class='diff-add'> measureText.appendChild(elt("br"));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> measureText.appendChild(document.createTextNode("x"));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> removeChildrenAndAdd(display.measure, measureText);</span>&nbsp; <span class='diff-add'> var height = measureText.offsetHeight / 50;</span>&nbsp; <span class='diff-add'> if (height > 3) display.cachedTextHeight = height;</span>&nbsp; <span class='diff-add'> removeChildren(display.measure);</span>&nbsp; <span class='diff-add'> return height || 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Compute the default character width.</span>&nbsp; <span class='diff-add'> function charWidth(display) {</span>&nbsp; <span class='diff-add'> if (display.cachedCharWidth != null) return display.cachedCharWidth;</span>&nbsp; <span class='diff-add'> var anchor = elt("span", "xxxxxxxxxx");</span>&nbsp; <span class='diff-add'> var pre = elt("pre", [anchor]);</span>&nbsp; <span class='diff-add'> removeChildrenAndAdd(display.measure, pre);</span>&nbsp; <span class='diff-add'> var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;</span>&nbsp; <span class='diff-add'> if (width > 2) display.cachedCharWidth = width;</span>&nbsp; <span class='diff-add'> return width || 10;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // OPERATIONS</span>&nbsp; <span class='diff-add'> // Operations are used to wrap a series of changes to the editor</span>&nbsp; <span class='diff-add'> // state in such a way that each change won't have to update the</span>&nbsp; <span class='diff-add'> // cursor and display (which would be awkward, slow, and</span>&nbsp; <span class='diff-add'> // error-prone). Instead, display updates are batched and then all</span>&nbsp; <span class='diff-add'> // combined and executed at once.</span>&nbsp; <span class='diff-add'> var operationGroup = null;</span>&nbsp; <span class='diff-add'> var nextOpId = 0;</span>&nbsp; <span class='diff-add'> // Start a new operation.</span>&nbsp; <span class='diff-add'> function startOperation(cm) {</span>&nbsp; <span class='diff-add'> cm.curOp = {</span>&nbsp; <span class='diff-add'> cm: cm,</span>&nbsp; <span class='diff-add'> viewChanged: false, // Flag that indicates that lines might need to be redrawn</span>&nbsp; <span class='diff-add'> startHeight: cm.doc.height, // Used to detect need to update scrollbar</span>&nbsp; <span class='diff-add'> forceUpdate: false, // Used to force a redraw</span>&nbsp; <span class='diff-add'> updateInput: null, // Whether to reset the input textarea</span>&nbsp; <span class='diff-add'> typing: false, // Whether this reset should be careful to leave existing text (for compositing)</span>&nbsp; <span class='diff-add'> changeObjs: null, // Accumulated changes, for firing change events</span>&nbsp; <span class='diff-add'> cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on</span>&nbsp; <span class='diff-add'> cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already</span>&nbsp; <span class='diff-add'> selectionChanged: false, // Whether the selection needs to be redrawn</span>&nbsp; <span class='diff-add'> updateMaxLine: false, // Set when the widest line needs to be determined anew</span>&nbsp; <span class='diff-add'> scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet</span>&nbsp; <span class='diff-add'> scrollToPos: null, // Used to scroll to a specific position</span>&nbsp; <span class='diff-add'> id: ++nextOpId // Unique ID</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (operationGroup) {</span>&nbsp; <span class='diff-add'> operationGroup.ops.push(cm.curOp);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> cm.curOp.ownsGroup = operationGroup = {</span>&nbsp; <span class='diff-add'> ops: [cm.curOp],</span>&nbsp; <span class='diff-add'> delayedCallbacks: []</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function fireCallbacksForOps(group) {</span>&nbsp; <span class='diff-add'> // Calls delayed callbacks and cursorActivity handlers until no</span>&nbsp; <span class='diff-add'> // new ones appear</span>&nbsp; <span class='diff-add'> var callbacks = group.delayedCallbacks, i = 0;</span>&nbsp; <span class='diff-add'> do {</span>&nbsp; <span class='diff-add'> for (; i < callbacks.length; i++)</span>&nbsp; <span class='diff-add'> callbacks[i]();</span>&nbsp; <span class='diff-add'> for (var j = 0; j < group.ops.length; j++) {</span>&nbsp; <span class='diff-add'> var op = group.ops[j];</span>&nbsp; <span class='diff-add'> if (op.cursorActivityHandlers)</span>&nbsp; <span class='diff-add'> while (op.cursorActivityCalled < op.cursorActivityHandlers.length)</span>&nbsp; <span class='diff-add'> op.cursorActivityHandlers[op.cursorActivityCalled++](op.cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } while (i < callbacks.length);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Finish an operation, updating the display and signalling delayed events</span>&nbsp; <span class='diff-add'> function endOperation(cm) {</span>&nbsp; <span class='diff-add'> var op = cm.curOp, group = op.ownsGroup;</span>&nbsp; <span class='diff-add'> if (!group) return;</span>&nbsp; <span class='diff-add'> try { fireCallbacksForOps(group); }</span>&nbsp; <span class='diff-add'> finally {</span>&nbsp; <span class='diff-add'> operationGroup = null;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < group.ops.length; i++)</span>&nbsp; <span class='diff-add'> group.ops[i].cm.curOp = null;</span>&nbsp; <span class='diff-add'> endOperations(group);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // The DOM updates done when an operation finishes are batched so</span>&nbsp; <span class='diff-add'> // that the minimum number of relayouts are required.</span>&nbsp; <span class='diff-add'> function endOperations(group) {</span>&nbsp; <span class='diff-add'> var ops = group.ops;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ops.length; i++) // Read DOM</span>&nbsp; <span class='diff-add'> endOperation_R1(ops[i]);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ops.length; i++) // Write DOM (maybe)</span>&nbsp; <span class='diff-add'> endOperation_W1(ops[i]);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ops.length; i++) // Read DOM</span>&nbsp; <span class='diff-add'> endOperation_R2(ops[i]);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ops.length; i++) // Write DOM (maybe)</span>&nbsp; <span class='diff-add'> endOperation_W2(ops[i]);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ops.length; i++) // Read DOM</span>&nbsp; <span class='diff-add'> endOperation_finish(ops[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function endOperation_R1(op) {</span>&nbsp; <span class='diff-add'> var cm = op.cm, display = cm.display;</span>&nbsp; <span class='diff-add'> maybeClipScrollbars(cm);</span>&nbsp; <span class='diff-add'> if (op.updateMaxLine) findMaxLine(cm);</span>&nbsp; <span class='diff-add'> op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||</span>&nbsp; <span class='diff-add'> op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||</span>&nbsp; <span class='diff-add'> op.scrollToPos.to.line >= display.viewTo) ||</span>&nbsp; <span class='diff-add'> display.maxLineChanged && cm.options.lineWrapping;</span>&nbsp; <span class='diff-add'> op.update = op.mustUpdate &&</span>&nbsp; <span class='diff-add'> new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function endOperation_W1(op) {</span>&nbsp; <span class='diff-add'> op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function endOperation_R2(op) {</span>&nbsp; <span class='diff-add'> var cm = op.cm, display = cm.display;</span>&nbsp; <span class='diff-add'> if (op.updatedDisplay) updateHeightsInViewport(cm);</span>&nbsp; <span class='diff-add'> op.barMeasure = measureForScrollbars(cm);</span>&nbsp; <span class='diff-add'> // If the max line changed since it was last measured, measure it,</span>&nbsp; <span class='diff-add'> // and ensure the document's width matches it.</span>&nbsp; <span class='diff-add'> // updateDisplay_W2 will use these properties to do the actual resizing</span>&nbsp; <span class='diff-add'> if (display.maxLineChanged && !cm.options.lineWrapping) {</span>&nbsp; <span class='diff-add'> op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;</span>&nbsp; <span class='diff-add'> cm.display.sizerWidth = op.adjustWidthTo;</span>&nbsp; <span class='diff-add'> op.barMeasure.scrollWidth =</span>&nbsp; <span class='diff-add'> Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);</span>&nbsp; <span class='diff-add'> op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (op.updatedDisplay || op.selectionChanged)</span>&nbsp; <span class='diff-add'> op.newSelectionNodes = drawSelection(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function endOperation_W2(op) {</span>&nbsp; <span class='diff-add'> var cm = op.cm;</span>&nbsp; <span class='diff-add'> if (op.adjustWidthTo != null) {</span>&nbsp; <span class='diff-add'> cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";</span>&nbsp; <span class='diff-add'> if (op.maxScrollLeft < cm.doc.scrollLeft)</span>&nbsp; <span class='diff-add'> setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true);</span>&nbsp; <span class='diff-add'> cm.display.maxLineChanged = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (op.newSelectionNodes)</span>&nbsp; <span class='diff-add'> showSelection(cm, op.newSelectionNodes);</span>&nbsp; <span class='diff-add'> if (op.updatedDisplay)</span>&nbsp; <span class='diff-add'> setDocumentHeight(cm, op.barMeasure);</span>&nbsp; <span class='diff-add'> if (op.updatedDisplay || op.startHeight != cm.doc.height)</span>&nbsp; <span class='diff-add'> updateScrollbars(cm, op.barMeasure);</span>&nbsp; <span class='diff-add'> if (op.selectionChanged) restartBlink(cm);</span>&nbsp; <span class='diff-add'> if (cm.state.focused && op.updateInput)</span>&nbsp; <span class='diff-add'> resetInput(cm, op.typing);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function endOperation_finish(op) {</span>&nbsp; <span class='diff-add'> var cm = op.cm, display = cm.display, doc = cm.doc;</span>&nbsp; <span class='diff-add'> if (op.updatedDisplay) postUpdateDisplay(cm, op.update);</span>&nbsp; <span class='diff-add'> // Abort mouse wheel delta measurement, when scrolling explicitly</span>&nbsp; <span class='diff-add'> if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))</span>&nbsp; <span class='diff-add'> display.wheelStartX = display.wheelStartY = null;</span>&nbsp; <span class='diff-add'> // Propagate the scroll position to the actual DOM scroller</span>&nbsp; <span class='diff-add'> if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) {</span>&nbsp; <span class='diff-add'> doc.scrollTop = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));</span>&nbsp; <span class='diff-add'> display.scrollbars.setScrollTop(doc.scrollTop);</span>&nbsp; <span class='diff-add'> display.scroller.scrollTop = doc.scrollTop;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) {</span>&nbsp; <span class='diff-add'> doc.scrollLeft = Math.max(0, Math.min(display.scroller.scrollWidth - displayWidth(cm), op.scrollLeft));</span>&nbsp; <span class='diff-add'> display.scrollbars.setScrollLeft(doc.scrollLeft);</span>&nbsp; <span class='diff-add'> display.scroller.scrollLeft = doc.scrollLeft;</span>&nbsp; <span class='diff-add'> alignHorizontally(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // If we need to scroll a specific position into view, do so.</span>&nbsp; <span class='diff-add'> if (op.scrollToPos) {</span>&nbsp; <span class='diff-add'> var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),</span>&nbsp; <span class='diff-add'> clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);</span>&nbsp; <span class='diff-add'> if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Fire events for markers that are hidden/unidden by editing or</span>&nbsp; <span class='diff-add'> // undoing</span>&nbsp; <span class='diff-add'> var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;</span>&nbsp; <span class='diff-add'> if (hidden) for (var i = 0; i < hidden.length; ++i)</span>&nbsp; <span class='diff-add'> if (!hidden[i].lines.length) signal(hidden[i], "hide");</span>&nbsp; <span class='diff-add'> if (unhidden) for (var i = 0; i < unhidden.length; ++i)</span>&nbsp; <span class='diff-add'> if (unhidden[i].lines.length) signal(unhidden[i], "unhide");</span>&nbsp; <span class='diff-add'> if (display.wrapper.offsetHeight)</span>&nbsp; <span class='diff-add'> doc.scrollTop = cm.display.scroller.scrollTop;</span>&nbsp; <span class='diff-add'> // Fire change events, and delayed event handlers</span>&nbsp; <span class='diff-add'> if (op.changeObjs)</span>&nbsp; <span class='diff-add'> signal(cm, "changes", cm, op.changeObjs);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Run the given function in an operation</span>&nbsp; <span class='diff-add'> function runInOp(cm, f) {</span>&nbsp; <span class='diff-add'> if (cm.curOp) return f();</span>&nbsp; <span class='diff-add'> startOperation(cm);</span>&nbsp; <span class='diff-add'> try { return f(); }</span>&nbsp; <span class='diff-add'> finally { endOperation(cm); }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Wraps a function in an operation. Returns the wrapped function.</span>&nbsp; <span class='diff-add'> function operation(cm, f) {</span>&nbsp; <span class='diff-add'> return function() {</span>&nbsp; <span class='diff-add'> if (cm.curOp) return f.apply(cm, arguments);</span>&nbsp; <span class='diff-add'> startOperation(cm);</span>&nbsp; <span class='diff-add'> try { return f.apply(cm, arguments); }</span>&nbsp; <span class='diff-add'> finally { endOperation(cm); }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Used to add methods to editor and doc instances, wrapping them in</span>&nbsp; <span class='diff-add'> // operations.</span>&nbsp; <span class='diff-add'> function methodOp(f) {</span>&nbsp; <span class='diff-add'> return function() {</span>&nbsp; <span class='diff-add'> if (this.curOp) return f.apply(this, arguments);</span>&nbsp; <span class='diff-add'> startOperation(this);</span>&nbsp; <span class='diff-add'> try { return f.apply(this, arguments); }</span>&nbsp; <span class='diff-add'> finally { endOperation(this); }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function docMethodOp(f) {</span>&nbsp; <span class='diff-add'> return function() {</span>&nbsp; <span class='diff-add'> var cm = this.cm;</span>&nbsp; <span class='diff-add'> if (!cm || cm.curOp) return f.apply(this, arguments);</span>&nbsp; <span class='diff-add'> startOperation(cm);</span>&nbsp; <span class='diff-add'> try { return f.apply(this, arguments); }</span>&nbsp; <span class='diff-add'> finally { endOperation(cm); }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // VIEW TRACKING</span>&nbsp; <span class='diff-add'> // These objects are used to represent the visible (currently drawn)</span>&nbsp; <span class='diff-add'> // part of the document. A LineView may correspond to multiple</span>&nbsp; <span class='diff-add'> // logical lines, if those are connected by collapsed ranges.</span>&nbsp; <span class='diff-add'> function LineView(doc, line, lineN) {</span>&nbsp; <span class='diff-add'> // The starting line</span>&nbsp; <span class='diff-add'> this.line = line;</span>&nbsp; <span class='diff-add'> // Continuing lines, if any</span>&nbsp; <span class='diff-add'> this.rest = visualLineContinued(line);</span>&nbsp; <span class='diff-add'> // Number of logical lines in this visual line</span>&nbsp; <span class='diff-add'> this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;</span>&nbsp; <span class='diff-add'> this.node = this.text = null;</span>&nbsp; <span class='diff-add'> this.hidden = lineIsHidden(doc, line);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Create a range of LineView objects for the given lines.</span>&nbsp; <span class='diff-add'> function buildViewArray(cm, from, to) {</span>&nbsp; <span class='diff-add'> var array = [], nextPos;</span>&nbsp; <span class='diff-add'> for (var pos = from; pos < to; pos = nextPos) {</span>&nbsp; <span class='diff-add'> var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);</span>&nbsp; <span class='diff-add'> nextPos = pos + view.size;</span>&nbsp; <span class='diff-add'> array.push(view);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return array;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Updates the display.view data structure for a given change to the</span>&nbsp; <span class='diff-add'> // document. From and to are in pre-change coordinates. Lendiff is</span>&nbsp; <span class='diff-add'> // the amount of lines added or subtracted by the change. This is</span>&nbsp; <span class='diff-add'> // used for changes that span multiple lines, or change the way</span>&nbsp; <span class='diff-add'> // lines are divided into visual lines. regLineChange (below)</span>&nbsp; <span class='diff-add'> // registers single-line changes.</span>&nbsp; <span class='diff-add'> function regChange(cm, from, to, lendiff) {</span>&nbsp; <span class='diff-add'> if (from == null) from = cm.doc.first;</span>&nbsp; <span class='diff-add'> if (to == null) to = cm.doc.first + cm.doc.size;</span>&nbsp; <span class='diff-add'> if (!lendiff) lendiff = 0;</span>&nbsp; <span class='diff-add'> var display = cm.display;</span>&nbsp; <span class='diff-add'> if (lendiff && to < display.viewTo &&</span>&nbsp; <span class='diff-add'> (display.updateLineNumbers == null || display.updateLineNumbers > from))</span>&nbsp; <span class='diff-add'> display.updateLineNumbers = from;</span>&nbsp; <span class='diff-add'> cm.curOp.viewChanged = true;</span>&nbsp; <span class='diff-add'> if (from >= display.viewTo) { // Change after</span>&nbsp; <span class='diff-add'> if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)</span>&nbsp; <span class='diff-add'> resetView(cm);</span>&nbsp; <span class='diff-add'> } else if (to <= display.viewFrom) { // Change before</span>&nbsp; <span class='diff-add'> if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {</span>&nbsp; <span class='diff-add'> resetView(cm);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> display.viewFrom += lendiff;</span>&nbsp; <span class='diff-add'> display.viewTo += lendiff;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap</span>&nbsp; <span class='diff-add'> resetView(cm);</span>&nbsp; <span class='diff-add'> } else if (from <= display.viewFrom) { // Top overlap</span>&nbsp; <span class='diff-add'> var cut = viewCuttingPoint(cm, to, to + lendiff, 1);</span>&nbsp; <span class='diff-add'> if (cut) {</span>&nbsp; <span class='diff-add'> display.view = display.view.slice(cut.index);</span>&nbsp; <span class='diff-add'> display.viewFrom = cut.lineN;</span>&nbsp; <span class='diff-add'> display.viewTo += lendiff;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> resetView(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (to >= display.viewTo) { // Bottom overlap</span>&nbsp; <span class='diff-add'> var cut = viewCuttingPoint(cm, from, from, -1);</span>&nbsp; <span class='diff-add'> if (cut) {</span>&nbsp; <span class='diff-add'> display.view = display.view.slice(0, cut.index);</span>&nbsp; <span class='diff-add'> display.viewTo = cut.lineN;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> resetView(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else { // Gap in the middle</span>&nbsp; <span class='diff-add'> var cutTop = viewCuttingPoint(cm, from, from, -1);</span>&nbsp; <span class='diff-add'> var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);</span>&nbsp; <span class='diff-add'> if (cutTop && cutBot) {</span>&nbsp; <span class='diff-add'> display.view = display.view.slice(0, cutTop.index)</span>&nbsp; <span class='diff-add'> .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))</span>&nbsp; <span class='diff-add'> .concat(display.view.slice(cutBot.index));</span>&nbsp; <span class='diff-add'> display.viewTo += lendiff;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> resetView(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var ext = display.externalMeasured;</span>&nbsp; <span class='diff-add'> if (ext) {</span>&nbsp; <span class='diff-add'> if (to < ext.lineN)</span>&nbsp; <span class='diff-add'> ext.lineN += lendiff;</span>&nbsp; <span class='diff-add'> else if (from < ext.lineN + ext.size)</span>&nbsp; <span class='diff-add'> display.externalMeasured = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Register a change to a single line. Type must be one of "text",</span>&nbsp; <span class='diff-add'> // "gutter", "class", "widget"</span>&nbsp; <span class='diff-add'> function regLineChange(cm, line, type) {</span>&nbsp; <span class='diff-add'> cm.curOp.viewChanged = true;</span>&nbsp; <span class='diff-add'> var display = cm.display, ext = cm.display.externalMeasured;</span>&nbsp; <span class='diff-add'> if (ext && line >= ext.lineN && line < ext.lineN + ext.size)</span>&nbsp; <span class='diff-add'> display.externalMeasured = null;</span>&nbsp; <span class='diff-add'> if (line < display.viewFrom || line >= display.viewTo) return;</span>&nbsp; <span class='diff-add'> var lineView = display.view[findViewIndex(cm, line)];</span>&nbsp; <span class='diff-add'> if (lineView.node == null) return;</span>&nbsp; <span class='diff-add'> var arr = lineView.changes || (lineView.changes = []);</span>&nbsp; <span class='diff-add'> if (indexOf(arr, type) == -1) arr.push(type);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Clear the view.</span>&nbsp; <span class='diff-add'> function resetView(cm) {</span>&nbsp; <span class='diff-add'> cm.display.viewFrom = cm.display.viewTo = cm.doc.first;</span>&nbsp; <span class='diff-add'> cm.display.view = [];</span>&nbsp; <span class='diff-add'> cm.display.viewOffset = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Find the view element corresponding to a given line. Return null</span>&nbsp; <span class='diff-add'> // when the line isn't visible.</span>&nbsp; <span class='diff-add'> function findViewIndex(cm, n) {</span>&nbsp; <span class='diff-add'> if (n >= cm.display.viewTo) return null;</span>&nbsp; <span class='diff-add'> n -= cm.display.viewFrom;</span>&nbsp; <span class='diff-add'> if (n < 0) return null;</span>&nbsp; <span class='diff-add'> var view = cm.display.view;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < view.length; i++) {</span>&nbsp; <span class='diff-add'> n -= view[i].size;</span>&nbsp; <span class='diff-add'> if (n < 0) return i;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function viewCuttingPoint(cm, oldN, newN, dir) {</span>&nbsp; <span class='diff-add'> var index = findViewIndex(cm, oldN), diff, view = cm.display.view;</span>&nbsp; <span class='diff-add'> if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)</span>&nbsp; <span class='diff-add'> return {index: index, lineN: newN};</span>&nbsp; <span class='diff-add'> for (var i = 0, n = cm.display.viewFrom; i < index; i++)</span>&nbsp; <span class='diff-add'> n += view[i].size;</span>&nbsp; <span class='diff-add'> if (n != oldN) {</span>&nbsp; <span class='diff-add'> if (dir > 0) {</span>&nbsp; <span class='diff-add'> if (index == view.length - 1) return null;</span>&nbsp; <span class='diff-add'> diff = (n + view[index].size) - oldN;</span>&nbsp; <span class='diff-add'> index++;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> diff = n - oldN;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> oldN += diff; newN += diff;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> while (visualLineNo(cm.doc, newN) != newN) {</span>&nbsp; <span class='diff-add'> if (index == (dir < 0 ? 0 : view.length - 1)) return null;</span>&nbsp; <span class='diff-add'> newN += dir * view[index - (dir < 0 ? 1 : 0)].size;</span>&nbsp; <span class='diff-add'> index += dir;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {index: index, lineN: newN};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Force the view to cover a given range, adding empty view element</span>&nbsp; <span class='diff-add'> // or clipping off existing ones as needed.</span>&nbsp; <span class='diff-add'> function adjustView(cm, from, to) {</span>&nbsp; <span class='diff-add'> var display = cm.display, view = display.view;</span>&nbsp; <span class='diff-add'> if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {</span>&nbsp; <span class='diff-add'> display.view = buildViewArray(cm, from, to);</span>&nbsp; <span class='diff-add'> display.viewFrom = from;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> if (display.viewFrom > from)</span>&nbsp; <span class='diff-add'> display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view);</span>&nbsp; <span class='diff-add'> else if (display.viewFrom < from)</span>&nbsp; <span class='diff-add'> display.view = display.view.slice(findViewIndex(cm, from));</span>&nbsp; <span class='diff-add'> display.viewFrom = from;</span>&nbsp; <span class='diff-add'> if (display.viewTo < to)</span>&nbsp; <span class='diff-add'> display.view = display.view.concat(buildViewArray(cm, display.viewTo, to));</span>&nbsp; <span class='diff-add'> else if (display.viewTo > to)</span>&nbsp; <span class='diff-add'> display.view = display.view.slice(0, findViewIndex(cm, to));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> display.viewTo = to;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Count the number of lines in the view whose DOM representation is</span>&nbsp; <span class='diff-add'> // out of date (or nonexistent).</span>&nbsp; <span class='diff-add'> function countDirtyView(cm) {</span>&nbsp; <span class='diff-add'> var view = cm.display.view, dirty = 0;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < view.length; i++) {</span>&nbsp; <span class='diff-add'> var lineView = view[i];</span>&nbsp; <span class='diff-add'> if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return dirty;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // INPUT HANDLING</span>&nbsp; <span class='diff-add'> // Poll for input changes, using the normal rate of polling. This</span>&nbsp; <span class='diff-add'> // runs as long as the editor is focused.</span>&nbsp; <span class='diff-add'> function slowPoll(cm) {</span>&nbsp; <span class='diff-add'> if (cm.display.pollingFast) return;</span>&nbsp; <span class='diff-add'> cm.display.poll.set(cm.options.pollInterval, function() {</span>&nbsp; <span class='diff-add'> readInput(cm);</span>&nbsp; <span class='diff-add'> if (cm.state.focused) slowPoll(cm);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // When an event has just come in that is likely to add or change</span>&nbsp; <span class='diff-add'> // something in the input textarea, we poll faster, to ensure that</span>&nbsp; <span class='diff-add'> // the change appears on the screen quickly.</span>&nbsp; <span class='diff-add'> function fastPoll(cm) {</span>&nbsp; <span class='diff-add'> var missed = false;</span>&nbsp; <span class='diff-add'> cm.display.pollingFast = true;</span>&nbsp; <span class='diff-add'> function p() {</span>&nbsp; <span class='diff-add'> var changed = readInput(cm);</span>&nbsp; <span class='diff-add'> if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);}</span>&nbsp; <span class='diff-add'> else {cm.display.pollingFast = false; slowPoll(cm);}</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.display.poll.set(20, p);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // This will be set to an array of strings when copying, so that,</span>&nbsp; <span class='diff-add'> // when pasting, we know what kind of selections the copied text</span>&nbsp; <span class='diff-add'> // was made out of.</span>&nbsp; <span class='diff-add'> var lastCopied = null;</span>&nbsp; <span class='diff-add'> // Read input from the textarea, and update the document to match.</span>&nbsp; <span class='diff-add'> // When something is selected, it is present in the textarea, and</span>&nbsp; <span class='diff-add'> // selected (unless it is huge, in which case a placeholder is</span>&nbsp; <span class='diff-add'> // used). When nothing is selected, the cursor sits after previously</span>&nbsp; <span class='diff-add'> // seen text (can be empty), which is stored in prevInput (we must</span>&nbsp; <span class='diff-add'> // not reset the textarea when typing, because that breaks IME).</span>&nbsp; <span class='diff-add'> function readInput(cm) {</span>&nbsp; <span class='diff-add'> var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc;</span>&nbsp; <span class='diff-add'> // Since this is called a *lot*, try to bail out as cheaply as</span>&nbsp; <span class='diff-add'> // possible when it is clear that nothing happened. hasSelection</span>&nbsp; <span class='diff-add'> // will be the case when there is a lot of text in the textarea,</span>&nbsp; <span class='diff-add'> // in which case reading its value would be expensive.</span>&nbsp; <span class='diff-add'> if (!cm.state.focused || (hasSelection(input) && !prevInput) || isReadOnly(cm) || cm.options.disableInput || cm.state.keySeq)</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> // See paste handler for more on the fakedLastChar kludge</span>&nbsp; <span class='diff-add'> if (cm.state.pasteIncoming && cm.state.fakedLastChar) {</span>&nbsp; <span class='diff-add'> input.value = input.value.substring(0, input.value.length - 1);</span>&nbsp; <span class='diff-add'> cm.state.fakedLastChar = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var text = input.value;</span>&nbsp; <span class='diff-add'> // If nothing changed, bail.</span>&nbsp; <span class='diff-add'> if (text == prevInput && !cm.somethingSelected()) return false;</span>&nbsp; <span class='diff-add'> // Work around nonsensical selection resetting in IE9/10, and</span>&nbsp; <span class='diff-add'> // inexplicable appearance of private area unicode characters on</span>&nbsp; <span class='diff-add'> // some key combos in Mac (#2689).</span>&nbsp; <span class='diff-add'> if (ie && ie_version >= 9 && cm.display.inputHasSelection === text ||</span>&nbsp; <span class='diff-add'> mac && /[\uf700-\uf7ff]/.test(text)) {</span>&nbsp; <span class='diff-add'> resetInput(cm);</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var withOp = !cm.curOp;</span>&nbsp; <span class='diff-add'> if (withOp) startOperation(cm);</span>&nbsp; <span class='diff-add'> cm.display.shift = false;</span>&nbsp; <span class='diff-add'> if (text.charCodeAt(0) == 0x200b && doc.sel == cm.display.selForContextMenu && !prevInput)</span>&nbsp; <span class='diff-add'> prevInput = "\u200b";</span>&nbsp; <span class='diff-add'> // Find the part of the input that is actually new</span>&nbsp; <span class='diff-add'> var same = 0, l = Math.min(prevInput.length, text.length);</span>&nbsp; <span class='diff-add'> while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;</span>&nbsp; <span class='diff-add'> var inserted = text.slice(same), textLines = splitLines(inserted);</span>&nbsp; <span class='diff-add'> // When pasing N lines into N selections, insert one line per selection</span>&nbsp; <span class='diff-add'> var multiPaste = null;</span>&nbsp; <span class='diff-add'> if (cm.state.pasteIncoming && doc.sel.ranges.length > 1) {</span>&nbsp; <span class='diff-add'> if (lastCopied && lastCopied.join("\n") == inserted)</span>&nbsp; <span class='diff-add'> multiPaste = doc.sel.ranges.length % lastCopied.length == 0 && map(lastCopied, splitLines);</span>&nbsp; <span class='diff-add'> else if (textLines.length == doc.sel.ranges.length)</span>&nbsp; <span class='diff-add'> multiPaste = map(textLines, function(l) { return [l]; });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Normal behavior is to insert the new text into every selection</span>&nbsp; <span class='diff-add'> for (var i = doc.sel.ranges.length - 1; i >= 0; i--) {</span>&nbsp; <span class='diff-add'> var range = doc.sel.ranges[i];</span>&nbsp; <span class='diff-add'> var from = range.from(), to = range.to();</span>&nbsp; <span class='diff-add'> // Handle deletion</span>&nbsp; <span class='diff-add'> if (same < prevInput.length)</span>&nbsp; <span class='diff-add'> from = Pos(from.line, from.ch - (prevInput.length - same));</span>&nbsp; <span class='diff-add'> // Handle overwrite</span>&nbsp; <span class='diff-add'> else if (cm.state.overwrite && range.empty() && !cm.state.pasteIncoming)</span>&nbsp; <span class='diff-add'> to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));</span>&nbsp; <span class='diff-add'> var updateInput = cm.curOp.updateInput;</span>&nbsp; <span class='diff-add'> var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,</span>&nbsp; <span class='diff-add'> origin: cm.state.pasteIncoming ? "paste" : cm.state.cutIncoming ? "cut" : "+input"};</span>&nbsp; <span class='diff-add'> makeChange(cm.doc, changeEvent);</span>&nbsp; <span class='diff-add'> signalLater(cm, "inputRead", cm, changeEvent);</span>&nbsp; <span class='diff-add'> // When an 'electric' character is inserted, immediately trigger a reindent</span>&nbsp; <span class='diff-add'> if (inserted && !cm.state.pasteIncoming && cm.options.electricChars &&</span>&nbsp; <span class='diff-add'> cm.options.smartIndent && range.head.ch < 100 &&</span>&nbsp; <span class='diff-add'> (!i || doc.sel.ranges[i - 1].head.line != range.head.line)) {</span>&nbsp; <span class='diff-add'> var mode = cm.getModeAt(range.head);</span>&nbsp; <span class='diff-add'> var end = changeEnd(changeEvent);</span>&nbsp; <span class='diff-add'> if (mode.electricChars) {</span>&nbsp; <span class='diff-add'> for (var j = 0; j < mode.electricChars.length; j++)</span>&nbsp; <span class='diff-add'> if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {</span>&nbsp; <span class='diff-add'> indentLine(cm, end.line, "smart");</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (mode.electricInput) {</span>&nbsp; <span class='diff-add'> if (mode.electricInput.test(getLine(doc, end.line).text.slice(0, end.ch)))</span>&nbsp; <span class='diff-add'> indentLine(cm, end.line, "smart");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ensureCursorVisible(cm);</span>&nbsp; <span class='diff-add'> cm.curOp.updateInput = updateInput;</span>&nbsp; <span class='diff-add'> cm.curOp.typing = true;</span>&nbsp; <span class='diff-add'> // Don't leave long text in the textarea, since it makes further polling slow</span>&nbsp; <span class='diff-add'> if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = "";</span>&nbsp; <span class='diff-add'> else cm.display.prevInput = text;</span>&nbsp; <span class='diff-add'> if (withOp) endOperation(cm);</span>&nbsp; <span class='diff-add'> cm.state.pasteIncoming = cm.state.cutIncoming = false;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Reset the input to correspond to the selection (or to be empty,</span>&nbsp; <span class='diff-add'> // when not typing and nothing is selected)</span>&nbsp; <span class='diff-add'> function resetInput(cm, typing) {</span>&nbsp; <span class='diff-add'> if (cm.display.contextMenuPending) return;</span>&nbsp; <span class='diff-add'> var minimal, selected, doc = cm.doc;</span>&nbsp; <span class='diff-add'> if (cm.somethingSelected()) {</span>&nbsp; <span class='diff-add'> cm.display.prevInput = "";</span>&nbsp; <span class='diff-add'> var range = doc.sel.primary();</span>&nbsp; <span class='diff-add'> minimal = hasCopyEvent &&</span>&nbsp; <span class='diff-add'> (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);</span>&nbsp; <span class='diff-add'> var content = minimal ? "-" : selected || cm.getSelection();</span>&nbsp; <span class='diff-add'> cm.display.input.value = content;</span>&nbsp; <span class='diff-add'> if (cm.state.focused) selectInput(cm.display.input);</span>&nbsp; <span class='diff-add'> if (ie && ie_version >= 9) cm.display.inputHasSelection = content;</span>&nbsp; <span class='diff-add'> } else if (!typing) {</span>&nbsp; <span class='diff-add'> cm.display.prevInput = cm.display.input.value = "";</span>&nbsp; <span class='diff-add'> if (ie && ie_version >= 9) cm.display.inputHasSelection = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.display.inaccurateSelection = minimal;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function focusInput(cm) {</span>&nbsp; <span class='diff-add'> if (cm.options.readOnly != "nocursor" && (!mobile || activeElt() != cm.display.input))</span>&nbsp; <span class='diff-add'> cm.display.input.focus();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function ensureFocus(cm) {</span>&nbsp; <span class='diff-add'> if (!cm.state.focused) { focusInput(cm); onFocus(cm); }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function isReadOnly(cm) {</span>&nbsp; <span class='diff-add'> return cm.options.readOnly || cm.doc.cantEdit;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // EVENT HANDLERS</span>&nbsp; <span class='diff-add'> // Attach the necessary event handlers when initializing the editor</span>&nbsp; <span class='diff-add'> function registerEventHandlers(cm) {</span>&nbsp; <span class='diff-add'> var d = cm.display;</span>&nbsp; <span class='diff-add'> on(d.scroller, "mousedown", operation(cm, onMouseDown));</span>&nbsp; <span class='diff-add'> // Older IE's will not fire a second mousedown for a double click</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 11)</span>&nbsp; <span class='diff-add'> on(d.scroller, "dblclick", operation(cm, function(e) {</span>&nbsp; <span class='diff-add'> if (signalDOMEvent(cm, e)) return;</span>&nbsp; <span class='diff-add'> var pos = posFromMouse(cm, e);</span>&nbsp; <span class='diff-add'> if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;</span>&nbsp; <span class='diff-add'> e_preventDefault(e);</span>&nbsp; <span class='diff-add'> var word = cm.findWordAt(pos);</span>&nbsp; <span class='diff-add'> extendSelection(cm.doc, word.anchor, word.head);</span>&nbsp; <span class='diff-add'> }));</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });</span>&nbsp; <span class='diff-add'> // Prevent normal selection in the editor (we handle our own)</span>&nbsp; <span class='diff-add'> on(d.lineSpace, "selectstart", function(e) {</span>&nbsp; <span class='diff-add'> if (!eventInWidget(d, e)) e_preventDefault(e);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Some browsers fire contextmenu *after* opening the menu, at</span>&nbsp; <span class='diff-add'> // which point we can't mess with it anymore. Context menu is</span>&nbsp; <span class='diff-add'> // handled in onMouseDown for these browsers.</span>&nbsp; <span class='diff-add'> if (!captureRightClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});</span>&nbsp; <span class='diff-add'> // Sync scrolling between fake scrollbars and real scrollable</span>&nbsp; <span class='diff-add'> // area, ensure viewport is updated when scrolling.</span>&nbsp; <span class='diff-add'> on(d.scroller, "scroll", function() {</span>&nbsp; <span class='diff-add'> if (d.scroller.clientHeight) {</span>&nbsp; <span class='diff-add'> setScrollTop(cm, d.scroller.scrollTop);</span>&nbsp; <span class='diff-add'> setScrollLeft(cm, d.scroller.scrollLeft, true);</span>&nbsp; <span class='diff-add'> signal(cm, "scroll", cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Listen to wheel events in order to try and update the viewport on time.</span>&nbsp; <span class='diff-add'> on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});</span>&nbsp; <span class='diff-add'> on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});</span>&nbsp; <span class='diff-add'> // Prevent wrapper from ever scrolling</span>&nbsp; <span class='diff-add'> on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });</span>&nbsp; <span class='diff-add'> on(d.input, "keyup", function(e) { onKeyUp.call(cm, e); });</span>&nbsp; <span class='diff-add'> on(d.input, "input", function() {</span>&nbsp; <span class='diff-add'> if (ie && ie_version >= 9 && cm.display.inputHasSelection) cm.display.inputHasSelection = null;</span>&nbsp; <span class='diff-add'> readInput(cm);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> on(d.input, "keydown", operation(cm, onKeyDown));</span>&nbsp; <span class='diff-add'> on(d.input, "keypress", operation(cm, onKeyPress));</span>&nbsp; <span class='diff-add'> on(d.input, "focus", bind(onFocus, cm));</span>&nbsp; <span class='diff-add'> on(d.input, "blur", bind(onBlur, cm));</span>&nbsp; <span class='diff-add'> function drag_(e) {</span>&nbsp; <span class='diff-add'> if (!signalDOMEvent(cm, e)) e_stop(e);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (cm.options.dragDrop) {</span>&nbsp; <span class='diff-add'> on(d.scroller, "dragstart", function(e){onDragStart(cm, e);});</span>&nbsp; <span class='diff-add'> on(d.scroller, "dragenter", drag_);</span>&nbsp; <span class='diff-add'> on(d.scroller, "dragover", drag_);</span>&nbsp; <span class='diff-add'> on(d.scroller, "drop", operation(cm, onDrop));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> on(d.scroller, "paste", function(e) {</span>&nbsp; <span class='diff-add'> if (eventInWidget(d, e)) return;</span>&nbsp; <span class='diff-add'> cm.state.pasteIncoming = true;</span>&nbsp; <span class='diff-add'> focusInput(cm);</span>&nbsp; <span class='diff-add'> fastPoll(cm);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> on(d.input, "paste", function() {</span>&nbsp; <span class='diff-add'> // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206</span>&nbsp; <span class='diff-add'> // Add a char to the end of textarea before paste occur so that</span>&nbsp; <span class='diff-add'> // selection doesn't span to the end of textarea.</span>&nbsp; <span class='diff-add'> if (webkit && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) {</span>&nbsp; <span class='diff-add'> var start = d.input.selectionStart, end = d.input.selectionEnd;</span>&nbsp; <span class='diff-add'> d.input.value += "$";</span>&nbsp; <span class='diff-add'> // The selection end needs to be set before the start, otherwise there</span>&nbsp; <span class='diff-add'> // can be an intermediate non-empty selection between the two, which</span>&nbsp; <span class='diff-add'> // can override the middle-click paste buffer on linux and cause the</span>&nbsp; <span class='diff-add'> // wrong thing to get pasted.</span>&nbsp; <span class='diff-add'> d.input.selectionEnd = end;</span>&nbsp; <span class='diff-add'> d.input.selectionStart = start;</span>&nbsp; <span class='diff-add'> cm.state.fakedLastChar = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.state.pasteIncoming = true;</span>&nbsp; <span class='diff-add'> fastPoll(cm);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> function prepareCopyCut(e) {</span>&nbsp; <span class='diff-add'> if (cm.somethingSelected()) {</span>&nbsp; <span class='diff-add'> lastCopied = cm.getSelections();</span>&nbsp; <span class='diff-add'> if (d.inaccurateSelection) {</span>&nbsp; <span class='diff-add'> d.prevInput = "";</span>&nbsp; <span class='diff-add'> d.inaccurateSelection = false;</span>&nbsp; <span class='diff-add'> d.input.value = lastCopied.join("\n");</span>&nbsp; <span class='diff-add'> selectInput(d.input);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var text = [], ranges = [];</span>&nbsp; <span class='diff-add'> for (var i = 0; i < cm.doc.sel.ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var line = cm.doc.sel.ranges[i].head.line;</span>&nbsp; <span class='diff-add'> var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};</span>&nbsp; <span class='diff-add'> ranges.push(lineRange);</span>&nbsp; <span class='diff-add'> text.push(cm.getRange(lineRange.anchor, lineRange.head));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (e.type == "cut") {</span>&nbsp; <span class='diff-add'> cm.setSelections(ranges, null, sel_dontScroll);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> d.prevInput = "";</span>&nbsp; <span class='diff-add'> d.input.value = text.join("\n");</span>&nbsp; <span class='diff-add'> selectInput(d.input);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> lastCopied = text;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (e.type == "cut") cm.state.cutIncoming = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> on(d.input, "cut", prepareCopyCut);</span>&nbsp; <span class='diff-add'> on(d.input, "copy", prepareCopyCut);</span>&nbsp; <span class='diff-add'> // Needed to handle Tab key in KHTML</span>&nbsp; <span class='diff-add'> if (khtml) on(d.sizer, "mouseup", function() {</span>&nbsp; <span class='diff-add'> if (activeElt() == d.input) d.input.blur();</span>&nbsp; <span class='diff-add'> focusInput(cm);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Called when the window resizes</span>&nbsp; <span class='diff-add'> function onResize(cm) {</span>&nbsp; <span class='diff-add'> var d = cm.display;</span>&nbsp; <span class='diff-add'> if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth)</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> // Might be a text scaling operation, clear size caches.</span>&nbsp; <span class='diff-add'> d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;</span>&nbsp; <span class='diff-add'> d.scrollbarsClipped = false;</span>&nbsp; <span class='diff-add'> cm.setSize();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // MOUSE EVENTS</span>&nbsp; <span class='diff-add'> // Return true when the given mouse event happened in a widget</span>&nbsp; <span class='diff-add'> function eventInWidget(display, e) {</span>&nbsp; <span class='diff-add'> for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {</span>&nbsp; <span class='diff-add'> if (!n || n.getAttribute("cm-ignore-events") == "true" || n.parentNode == display.sizer && n != display.mover) return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Given a mouse event, find the corresponding position. If liberal</span>&nbsp; <span class='diff-add'> // is false, it checks whether a gutter or scrollbar was clicked,</span>&nbsp; <span class='diff-add'> // and returns null if it was. forRect is used by rectangular</span>&nbsp; <span class='diff-add'> // selections, and tries to estimate a character position even for</span>&nbsp; <span class='diff-add'> // coordinates beyond the right of the text.</span>&nbsp; <span class='diff-add'> function posFromMouse(cm, e, liberal, forRect) {</span>&nbsp; <span class='diff-add'> var display = cm.display;</span>&nbsp; <span class='diff-add'> if (!liberal && e_target(e).getAttribute("not-content") == "true") return null;</span>&nbsp; <span class='diff-add'> var x, y, space = display.lineSpace.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> // Fails unpredictably on IE[67] when mouse is dragged around quickly.</span>&nbsp; <span class='diff-add'> try { x = e.clientX - space.left; y = e.clientY - space.top; }</span>&nbsp; <span class='diff-add'> catch (e) { return null; }</span>&nbsp; <span class='diff-add'> var coords = coordsChar(cm, x, y), line;</span>&nbsp; <span class='diff-add'> if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {</span>&nbsp; <span class='diff-add'> var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;</span>&nbsp; <span class='diff-add'> coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return coords;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // A mouse down can be a single click, double click, triple click,</span>&nbsp; <span class='diff-add'> // start of selection drag, start of text drag, new cursor</span>&nbsp; <span class='diff-add'> // (ctrl-click), rectangle drag (alt-drag), or xwin</span>&nbsp; <span class='diff-add'> // middle-click-paste. Or it might be a click on something we should</span>&nbsp; <span class='diff-add'> // not interfere with, such as a scrollbar or widget.</span>&nbsp; <span class='diff-add'> function onMouseDown(e) {</span>&nbsp; <span class='diff-add'> if (signalDOMEvent(this, e)) return;</span>&nbsp; <span class='diff-add'> var cm = this, display = cm.display;</span>&nbsp; <span class='diff-add'> display.shift = e.shiftKey;</span>&nbsp; <span class='diff-add'> if (eventInWidget(display, e)) {</span>&nbsp; <span class='diff-add'> if (!webkit) {</span>&nbsp; <span class='diff-add'> // Briefly turn off draggability, to allow widgets to do</span>&nbsp; <span class='diff-add'> // normal dragging things.</span>&nbsp; <span class='diff-add'> display.scroller.draggable = false;</span>&nbsp; <span class='diff-add'> setTimeout(function(){display.scroller.draggable = true;}, 100);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (clickInGutter(cm, e)) return;</span>&nbsp; <span class='diff-add'> var start = posFromMouse(cm, e);</span>&nbsp; <span class='diff-add'> window.focus();</span>&nbsp; <span class='diff-add'> switch (e_button(e)) {</span>&nbsp; <span class='diff-add'> case 1:</span>&nbsp; <span class='diff-add'> if (start)</span>&nbsp; <span class='diff-add'> leftButtonDown(cm, e, start);</span>&nbsp; <span class='diff-add'> else if (e_target(e) == display.scroller)</span>&nbsp; <span class='diff-add'> e_preventDefault(e);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 2:</span>&nbsp; <span class='diff-add'> if (webkit) cm.state.lastMiddleDown = +new Date;</span>&nbsp; <span class='diff-add'> if (start) extendSelection(cm.doc, start);</span>&nbsp; <span class='diff-add'> setTimeout(bind(focusInput, cm), 20);</span>&nbsp; <span class='diff-add'> e_preventDefault(e);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 3:</span>&nbsp; <span class='diff-add'> if (captureRightClick) onContextMenu(cm, e);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lastClick, lastDoubleClick;</span>&nbsp; <span class='diff-add'> function leftButtonDown(cm, e, start) {</span>&nbsp; <span class='diff-add'> setTimeout(bind(ensureFocus, cm), 0);</span>&nbsp; <span class='diff-add'> var now = +new Date, type;</span>&nbsp; <span class='diff-add'> if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {</span>&nbsp; <span class='diff-add'> type = "triple";</span>&nbsp; <span class='diff-add'> } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {</span>&nbsp; <span class='diff-add'> type = "double";</span>&nbsp; <span class='diff-add'> lastDoubleClick = {time: now, pos: start};</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> type = "single";</span>&nbsp; <span class='diff-add'> lastClick = {time: now, pos: start};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained;</span>&nbsp; <span class='diff-add'> if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) &&</span>&nbsp; <span class='diff-add'> type == "single" && (contained = sel.contains(start)) > -1 &&</span>&nbsp; <span class='diff-add'> !sel.ranges[contained].empty())</span>&nbsp; <span class='diff-add'> leftButtonStartDrag(cm, e, start, modifier);</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> leftButtonSelect(cm, e, start, type, modifier);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Start a text drag. When it ends, see if any dragging actually</span>&nbsp; <span class='diff-add'> // happen, and treat as a click if it didn't.</span>&nbsp; <span class='diff-add'> function leftButtonStartDrag(cm, e, start, modifier) {</span>&nbsp; <span class='diff-add'> var display = cm.display;</span>&nbsp; <span class='diff-add'> var dragEnd = operation(cm, function(e2) {</span>&nbsp; <span class='diff-add'> if (webkit) display.scroller.draggable = false;</span>&nbsp; <span class='diff-add'> cm.state.draggingText = false;</span>&nbsp; <span class='diff-add'> off(document, "mouseup", dragEnd);</span>&nbsp; <span class='diff-add'> off(display.scroller, "drop", dragEnd);</span>&nbsp; <span class='diff-add'> if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {</span>&nbsp; <span class='diff-add'> e_preventDefault(e2);</span>&nbsp; <span class='diff-add'> if (!modifier)</span>&nbsp; <span class='diff-add'> extendSelection(cm.doc, start);</span>&nbsp; <span class='diff-add'> focusInput(cm);</span>&nbsp; <span class='diff-add'> // Work around unexplainable focus problem in IE9 (#2127)</span>&nbsp; <span class='diff-add'> if (ie && ie_version == 9)</span>&nbsp; <span class='diff-add'> setTimeout(function() {document.body.focus(); focusInput(cm);}, 20);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Let the drag handler handle this.</span>&nbsp; <span class='diff-add'> if (webkit) display.scroller.draggable = true;</span>&nbsp; <span class='diff-add'> cm.state.draggingText = dragEnd;</span>&nbsp; <span class='diff-add'> // IE's approach to draggable</span>&nbsp; <span class='diff-add'> if (display.scroller.dragDrop) display.scroller.dragDrop();</span>&nbsp; <span class='diff-add'> on(document, "mouseup", dragEnd);</span>&nbsp; <span class='diff-add'> on(display.scroller, "drop", dragEnd);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Normal selection, as opposed to text dragging.</span>&nbsp; <span class='diff-add'> function leftButtonSelect(cm, e, start, type, addNew) {</span>&nbsp; <span class='diff-add'> var display = cm.display, doc = cm.doc;</span>&nbsp; <span class='diff-add'> e_preventDefault(e);</span>&nbsp; <span class='diff-add'> var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;</span>&nbsp; <span class='diff-add'> if (addNew && !e.shiftKey) {</span>&nbsp; <span class='diff-add'> ourIndex = doc.sel.contains(start);</span>&nbsp; <span class='diff-add'> if (ourIndex > -1)</span>&nbsp; <span class='diff-add'> ourRange = ranges[ourIndex];</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> ourRange = new Range(start, start);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> ourRange = doc.sel.primary();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (e.altKey) {</span>&nbsp; <span class='diff-add'> type = "rect";</span>&nbsp; <span class='diff-add'> if (!addNew) ourRange = new Range(start, start);</span>&nbsp; <span class='diff-add'> start = posFromMouse(cm, e, true, true);</span>&nbsp; <span class='diff-add'> ourIndex = -1;</span>&nbsp; <span class='diff-add'> } else if (type == "double") {</span>&nbsp; <span class='diff-add'> var word = cm.findWordAt(start);</span>&nbsp; <span class='diff-add'> if (cm.display.shift || doc.extend)</span>&nbsp; <span class='diff-add'> ourRange = extendRange(doc, ourRange, word.anchor, word.head);</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> ourRange = word;</span>&nbsp; <span class='diff-add'> } else if (type == "triple") {</span>&nbsp; <span class='diff-add'> var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));</span>&nbsp; <span class='diff-add'> if (cm.display.shift || doc.extend)</span>&nbsp; <span class='diff-add'> ourRange = extendRange(doc, ourRange, line.anchor, line.head);</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> ourRange = line;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> ourRange = extendRange(doc, ourRange, start);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!addNew) {</span>&nbsp; <span class='diff-add'> ourIndex = 0;</span>&nbsp; <span class='diff-add'> setSelection(doc, new Selection([ourRange], 0), sel_mouse);</span>&nbsp; <span class='diff-add'> startSel = doc.sel;</span>&nbsp; <span class='diff-add'> } else if (ourIndex == -1) {</span>&nbsp; <span class='diff-add'> ourIndex = ranges.length;</span>&nbsp; <span class='diff-add'> setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex),</span>&nbsp; <span class='diff-add'> {scroll: false, origin: "*mouse"});</span>&nbsp; <span class='diff-add'> } else if (ranges.length > 1 && ranges[ourIndex].empty() && type == "single") {</span>&nbsp; <span class='diff-add'> setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0));</span>&nbsp; <span class='diff-add'> startSel = doc.sel;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lastPos = start;</span>&nbsp; <span class='diff-add'> function extendTo(pos) {</span>&nbsp; <span class='diff-add'> if (cmp(lastPos, pos) == 0) return;</span>&nbsp; <span class='diff-add'> lastPos = pos;</span>&nbsp; <span class='diff-add'> if (type == "rect") {</span>&nbsp; <span class='diff-add'> var ranges = [], tabSize = cm.options.tabSize;</span>&nbsp; <span class='diff-add'> var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);</span>&nbsp; <span class='diff-add'> var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);</span>&nbsp; <span class='diff-add'> var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);</span>&nbsp; <span class='diff-add'> for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));</span>&nbsp; <span class='diff-add'> line <= end; line++) {</span>&nbsp; <span class='diff-add'> var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);</span>&nbsp; <span class='diff-add'> if (left == right)</span>&nbsp; <span class='diff-add'> ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)));</span>&nbsp; <span class='diff-add'> else if (text.length > leftPos)</span>&nbsp; <span class='diff-add'> ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!ranges.length) ranges.push(new Range(start, start));</span>&nbsp; <span class='diff-add'> setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),</span>&nbsp; <span class='diff-add'> {origin: "*mouse", scroll: false});</span>&nbsp; <span class='diff-add'> cm.scrollIntoView(pos);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var oldRange = ourRange;</span>&nbsp; <span class='diff-add'> var anchor = oldRange.anchor, head = pos;</span>&nbsp; <span class='diff-add'> if (type != "single") {</span>&nbsp; <span class='diff-add'> if (type == "double")</span>&nbsp; <span class='diff-add'> var range = cm.findWordAt(pos);</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));</span>&nbsp; <span class='diff-add'> if (cmp(range.anchor, anchor) > 0) {</span>&nbsp; <span class='diff-add'> head = range.head;</span>&nbsp; <span class='diff-add'> anchor = minPos(oldRange.from(), range.anchor);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> head = range.anchor;</span>&nbsp; <span class='diff-add'> anchor = maxPos(oldRange.to(), range.head);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var ranges = startSel.ranges.slice(0);</span>&nbsp; <span class='diff-add'> ranges[ourIndex] = new Range(clipPos(doc, anchor), head);</span>&nbsp; <span class='diff-add'> setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var editorSize = display.wrapper.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> // Used to ensure timeout re-tries don't fire when another extend</span>&nbsp; <span class='diff-add'> // happened in the meantime (clearTimeout isn't reliable -- at</span>&nbsp; <span class='diff-add'> // least on Chrome, the timeouts still happen even when cleared,</span>&nbsp; <span class='diff-add'> // if the clear happens after their scheduled firing time).</span>&nbsp; <span class='diff-add'> var counter = 0;</span>&nbsp; <span class='diff-add'> function extend(e) {</span>&nbsp; <span class='diff-add'> var curCount = ++counter;</span>&nbsp; <span class='diff-add'> var cur = posFromMouse(cm, e, true, type == "rect");</span>&nbsp; <span class='diff-add'> if (!cur) return;</span>&nbsp; <span class='diff-add'> if (cmp(cur, lastPos) != 0) {</span>&nbsp; <span class='diff-add'> ensureFocus(cm);</span>&nbsp; <span class='diff-add'> extendTo(cur);</span>&nbsp; <span class='diff-add'> var visible = visibleLines(display, doc);</span>&nbsp; <span class='diff-add'> if (cur.line >= visible.to || cur.line < visible.from)</span>&nbsp; <span class='diff-add'> setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;</span>&nbsp; <span class='diff-add'> if (outside) setTimeout(operation(cm, function() {</span>&nbsp; <span class='diff-add'> if (counter != curCount) return;</span>&nbsp; <span class='diff-add'> display.scroller.scrollTop += outside;</span>&nbsp; <span class='diff-add'> extend(e);</span>&nbsp; <span class='diff-add'> }), 50);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function done(e) {</span>&nbsp; <span class='diff-add'> counter = Infinity;</span>&nbsp; <span class='diff-add'> e_preventDefault(e);</span>&nbsp; <span class='diff-add'> focusInput(cm);</span>&nbsp; <span class='diff-add'> off(document, "mousemove", move);</span>&nbsp; <span class='diff-add'> off(document, "mouseup", up);</span>&nbsp; <span class='diff-add'> doc.history.lastSelOrigin = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var move = operation(cm, function(e) {</span>&nbsp; <span class='diff-add'> if (!e_button(e)) done(e);</span>&nbsp; <span class='diff-add'> else extend(e);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var up = operation(cm, done);</span>&nbsp; <span class='diff-add'> on(document, "mousemove", move);</span>&nbsp; <span class='diff-add'> on(document, "mouseup", up);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Determines whether an event happened in the gutter, and fires the</span>&nbsp; <span class='diff-add'> // handlers for the corresponding event.</span>&nbsp; <span class='diff-add'> function gutterEvent(cm, e, type, prevent, signalfn) {</span>&nbsp; <span class='diff-add'> try { var mX = e.clientX, mY = e.clientY; }</span>&nbsp; <span class='diff-add'> catch(e) { return false; }</span>&nbsp; <span class='diff-add'> if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false;</span>&nbsp; <span class='diff-add'> if (prevent) e_preventDefault(e);</span>&nbsp; <span class='diff-add'> var display = cm.display;</span>&nbsp; <span class='diff-add'> var lineBox = display.lineDiv.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);</span>&nbsp; <span class='diff-add'> mY -= lineBox.top - display.viewOffset;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < cm.options.gutters.length; ++i) {</span>&nbsp; <span class='diff-add'> var g = display.gutters.childNodes[i];</span>&nbsp; <span class='diff-add'> if (g && g.getBoundingClientRect().right >= mX) {</span>&nbsp; <span class='diff-add'> var line = lineAtHeight(cm.doc, mY);</span>&nbsp; <span class='diff-add'> var gutter = cm.options.gutters[i];</span>&nbsp; <span class='diff-add'> signalfn(cm, type, cm, line, gutter, e);</span>&nbsp; <span class='diff-add'> return e_defaultPrevented(e);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function clickInGutter(cm, e) {</span>&nbsp; <span class='diff-add'> return gutterEvent(cm, e, "gutterClick", true, signalLater);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Kludge to work around strange IE behavior where it'll sometimes</span>&nbsp; <span class='diff-add'> // re-fire a series of drag-related events right after the drop (#1551)</span>&nbsp; <span class='diff-add'> var lastDrop = 0;</span>&nbsp; <span class='diff-add'> function onDrop(e) {</span>&nbsp; <span class='diff-add'> var cm = this;</span>&nbsp; <span class='diff-add'> if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> e_preventDefault(e);</span>&nbsp; <span class='diff-add'> if (ie) lastDrop = +new Date;</span>&nbsp; <span class='diff-add'> var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;</span>&nbsp; <span class='diff-add'> if (!pos || isReadOnly(cm)) return;</span>&nbsp; <span class='diff-add'> // Might be a file drop, in which case we simply extract the text</span>&nbsp; <span class='diff-add'> // and insert it.</span>&nbsp; <span class='diff-add'> if (files && files.length && window.FileReader && window.File) {</span>&nbsp; <span class='diff-add'> var n = files.length, text = Array(n), read = 0;</span>&nbsp; <span class='diff-add'> var loadFile = function(file, i) {</span>&nbsp; <span class='diff-add'> var reader = new FileReader;</span>&nbsp; <span class='diff-add'> reader.onload = operation(cm, function() {</span>&nbsp; <span class='diff-add'> text[i] = reader.result;</span>&nbsp; <span class='diff-add'> if (++read == n) {</span>&nbsp; <span class='diff-add'> pos = clipPos(cm.doc, pos);</span>&nbsp; <span class='diff-add'> var change = {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"};</span>&nbsp; <span class='diff-add'> makeChange(cm.doc, change);</span>&nbsp; <span class='diff-add'> setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> reader.readAsText(file);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> for (var i = 0; i < n; ++i) loadFile(files[i], i);</span>&nbsp; <span class='diff-add'> } else { // Normal drop</span>&nbsp; <span class='diff-add'> // Don't do a replace if the drop happened inside of the selected text.</span>&nbsp; <span class='diff-add'> if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {</span>&nbsp; <span class='diff-add'> cm.state.draggingText(e);</span>&nbsp; <span class='diff-add'> // Ensure the editor is re-focused</span>&nbsp; <span class='diff-add'> setTimeout(bind(focusInput, cm), 20);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> var text = e.dataTransfer.getData("Text");</span>&nbsp; <span class='diff-add'> if (text) {</span>&nbsp; <span class='diff-add'> if (cm.state.draggingText && !(mac ? e.metaKey : e.ctrlKey))</span>&nbsp; <span class='diff-add'> var selected = cm.listSelections();</span>&nbsp; <span class='diff-add'> setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));</span>&nbsp; <span class='diff-add'> if (selected) for (var i = 0; i < selected.length; ++i)</span>&nbsp; <span class='diff-add'> replaceRange(cm.doc, "", selected[i].anchor, selected[i].head, "drag");</span>&nbsp; <span class='diff-add'> cm.replaceSelection(text, "around", "paste");</span>&nbsp; <span class='diff-add'> focusInput(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> catch(e){}</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function onDragStart(cm, e) {</span>&nbsp; <span class='diff-add'> if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }</span>&nbsp; <span class='diff-add'> if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;</span>&nbsp; <span class='diff-add'> e.dataTransfer.setData("Text", cm.getSelection());</span>&nbsp; <span class='diff-add'> // Use dummy image instead of default browsers image.</span>&nbsp; <span class='diff-add'> // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.</span>&nbsp; <span class='diff-add'> if (e.dataTransfer.setDragImage && !safari) {</span>&nbsp; <span class='diff-add'> var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");</span>&nbsp; <span class='diff-add'> img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";</span>&nbsp; <span class='diff-add'> if (presto) {</span>&nbsp; <span class='diff-add'> img.width = img.height = 1;</span>&nbsp; <span class='diff-add'> cm.display.wrapper.appendChild(img);</span>&nbsp; <span class='diff-add'> // Force a relayout, or Opera won't use our image for some obscure reason</span>&nbsp; <span class='diff-add'> img._top = img.offsetTop;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> e.dataTransfer.setDragImage(img, 0, 0);</span>&nbsp; <span class='diff-add'> if (presto) img.parentNode.removeChild(img);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // SCROLL EVENTS</span>&nbsp; <span class='diff-add'> // Sync the scrollable area and scrollbars, ensure the viewport</span>&nbsp; <span class='diff-add'> // covers the visible area.</span>&nbsp; <span class='diff-add'> function setScrollTop(cm, val) {</span>&nbsp; <span class='diff-add'> if (Math.abs(cm.doc.scrollTop - val) < 2) return;</span>&nbsp; <span class='diff-add'> cm.doc.scrollTop = val;</span>&nbsp; <span class='diff-add'> if (!gecko) updateDisplaySimple(cm, {top: val});</span>&nbsp; <span class='diff-add'> if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;</span>&nbsp; <span class='diff-add'> cm.display.scrollbars.setScrollTop(val);</span>&nbsp; <span class='diff-add'> if (gecko) updateDisplaySimple(cm);</span>&nbsp; <span class='diff-add'> startWorker(cm, 100);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Sync scroller and scrollbar, ensure the gutter elements are</span>&nbsp; <span class='diff-add'> // aligned.</span>&nbsp; <span class='diff-add'> function setScrollLeft(cm, val, isScroller) {</span>&nbsp; <span class='diff-add'> if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;</span>&nbsp; <span class='diff-add'> val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);</span>&nbsp; <span class='diff-add'> cm.doc.scrollLeft = val;</span>&nbsp; <span class='diff-add'> alignHorizontally(cm);</span>&nbsp; <span class='diff-add'> if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;</span>&nbsp; <span class='diff-add'> cm.display.scrollbars.setScrollLeft(val);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Since the delta values reported on mouse wheel events are</span>&nbsp; <span class='diff-add'> // unstandardized between browsers and even browser versions, and</span>&nbsp; <span class='diff-add'> // generally horribly unpredictable, this code starts by measuring</span>&nbsp; <span class='diff-add'> // the scroll effect that the first few mouse wheel events have,</span>&nbsp; <span class='diff-add'> // and, from that, detects the way it can convert deltas to pixel</span>&nbsp; <span class='diff-add'> // offsets afterwards.</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // The reason we want to know the amount a wheel event will scroll</span>&nbsp; <span class='diff-add'> // is that it gives us a chance to update the display before the</span>&nbsp; <span class='diff-add'> // actual scrolling happens, reducing flickering.</span>&nbsp; <span class='diff-add'> var wheelSamples = 0, wheelPixelsPerUnit = null;</span>&nbsp; <span class='diff-add'> // Fill in a browser-detected starting value on browsers where we</span>&nbsp; <span class='diff-add'> // know one. These don't have to be accurate -- the result of them</span>&nbsp; <span class='diff-add'> // being wrong would just be a slight flicker on the first wheel</span>&nbsp; <span class='diff-add'> // scroll (if it is large enough).</span>&nbsp; <span class='diff-add'> if (ie) wheelPixelsPerUnit = -.53;</span>&nbsp; <span class='diff-add'> else if (gecko) wheelPixelsPerUnit = 15;</span>&nbsp; <span class='diff-add'> else if (chrome) wheelPixelsPerUnit = -.7;</span>&nbsp; <span class='diff-add'> else if (safari) wheelPixelsPerUnit = -1/3;</span>&nbsp; <span class='diff-add'> var wheelEventDelta = function(e) {</span>&nbsp; <span class='diff-add'> var dx = e.wheelDeltaX, dy = e.wheelDeltaY;</span>&nbsp; <span class='diff-add'> if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;</span>&nbsp; <span class='diff-add'> if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;</span>&nbsp; <span class='diff-add'> else if (dy == null) dy = e.wheelDelta;</span>&nbsp; <span class='diff-add'> return {x: dx, y: dy};</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeMirror.wheelEventPixels = function(e) {</span>&nbsp; <span class='diff-add'> var delta = wheelEventDelta(e);</span>&nbsp; <span class='diff-add'> delta.x *= wheelPixelsPerUnit;</span>&nbsp; <span class='diff-add'> delta.y *= wheelPixelsPerUnit;</span>&nbsp; <span class='diff-add'> return delta;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function onScrollWheel(cm, e) {</span>&nbsp; <span class='diff-add'> var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;</span>&nbsp; <span class='diff-add'> var display = cm.display, scroll = display.scroller;</span>&nbsp; <span class='diff-add'> // Quit if there's nothing to scroll here</span>&nbsp; <span class='diff-add'> if (!(dx && scroll.scrollWidth > scroll.clientWidth ||</span>&nbsp; <span class='diff-add'> dy && scroll.scrollHeight > scroll.clientHeight)) return;</span>&nbsp; <span class='diff-add'> // Webkit browsers on OS X abort momentum scrolls when the target</span>&nbsp; <span class='diff-add'> // of the scroll event is removed from the scrollable element.</span>&nbsp; <span class='diff-add'> // This hack (see related code in patchDisplay) makes sure the</span>&nbsp; <span class='diff-add'> // element is kept around.</span>&nbsp; <span class='diff-add'> if (dy && mac && webkit) {</span>&nbsp; <span class='diff-add'> outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < view.length; i++) {</span>&nbsp; <span class='diff-add'> if (view[i].node == cur) {</span>&nbsp; <span class='diff-add'> cm.display.currentWheelTarget = cur;</span>&nbsp; <span class='diff-add'> break outer;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // On some browsers, horizontal scrolling will cause redraws to</span>&nbsp; <span class='diff-add'> // happen before the gutter has been realigned, causing it to</span>&nbsp; <span class='diff-add'> // wriggle around in a most unseemly way. When we have an</span>&nbsp; <span class='diff-add'> // estimated pixels/delta value, we just handle horizontal</span>&nbsp; <span class='diff-add'> // scrolling entirely here. It'll be slightly off from native, but</span>&nbsp; <span class='diff-add'> // better than glitching out.</span>&nbsp; <span class='diff-add'> if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {</span>&nbsp; <span class='diff-add'> if (dy)</span>&nbsp; <span class='diff-add'> setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));</span>&nbsp; <span class='diff-add'> setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));</span>&nbsp; <span class='diff-add'> e_preventDefault(e);</span>&nbsp; <span class='diff-add'> display.wheelStartX = null; // Abort measurement, if in progress</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // 'Project' the visible viewport to cover the area that is being</span>&nbsp; <span class='diff-add'> // scrolled into view (if we know enough to estimate it).</span>&nbsp; <span class='diff-add'> if (dy && wheelPixelsPerUnit != null) {</span>&nbsp; <span class='diff-add'> var pixels = dy * wheelPixelsPerUnit;</span>&nbsp; <span class='diff-add'> var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;</span>&nbsp; <span class='diff-add'> if (pixels < 0) top = Math.max(0, top + pixels - 50);</span>&nbsp; <span class='diff-add'> else bot = Math.min(cm.doc.height, bot + pixels + 50);</span>&nbsp; <span class='diff-add'> updateDisplaySimple(cm, {top: top, bottom: bot});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (wheelSamples < 20) {</span>&nbsp; <span class='diff-add'> if (display.wheelStartX == null) {</span>&nbsp; <span class='diff-add'> display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;</span>&nbsp; <span class='diff-add'> display.wheelDX = dx; display.wheelDY = dy;</span>&nbsp; <span class='diff-add'> setTimeout(function() {</span>&nbsp; <span class='diff-add'> if (display.wheelStartX == null) return;</span>&nbsp; <span class='diff-add'> var movedX = scroll.scrollLeft - display.wheelStartX;</span>&nbsp; <span class='diff-add'> var movedY = scroll.scrollTop - display.wheelStartY;</span>&nbsp; <span class='diff-add'> var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||</span>&nbsp; <span class='diff-add'> (movedX && display.wheelDX && movedX / display.wheelDX);</span>&nbsp; <span class='diff-add'> display.wheelStartX = display.wheelStartY = null;</span>&nbsp; <span class='diff-add'> if (!sample) return;</span>&nbsp; <span class='diff-add'> wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);</span>&nbsp; <span class='diff-add'> ++wheelSamples;</span>&nbsp; <span class='diff-add'> }, 200);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> display.wheelDX += dx; display.wheelDY += dy;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // KEY EVENTS</span>&nbsp; <span class='diff-add'> // Run a handler that was bound to a key.</span>&nbsp; <span class='diff-add'> function doHandleBinding(cm, bound, dropShift) {</span>&nbsp; <span class='diff-add'> if (typeof bound == "string") {</span>&nbsp; <span class='diff-add'> bound = commands[bound];</span>&nbsp; <span class='diff-add'> if (!bound) return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Ensure previous input has been read, so that the handler sees a</span>&nbsp; <span class='diff-add'> // consistent view of the document</span>&nbsp; <span class='diff-add'> if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false;</span>&nbsp; <span class='diff-add'> var prevShift = cm.display.shift, done = false;</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> if (isReadOnly(cm)) cm.state.suppressEdits = true;</span>&nbsp; <span class='diff-add'> if (dropShift) cm.display.shift = false;</span>&nbsp; <span class='diff-add'> done = bound(cm) != Pass;</span>&nbsp; <span class='diff-add'> } finally {</span>&nbsp; <span class='diff-add'> cm.display.shift = prevShift;</span>&nbsp; <span class='diff-add'> cm.state.suppressEdits = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return done;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function lookupKeyForEditor(cm, name, handle) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < cm.state.keyMaps.length; i++) {</span>&nbsp; <span class='diff-add'> var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);</span>&nbsp; <span class='diff-add'> if (result) return result;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))</span>&nbsp; <span class='diff-add'> || lookupKey(name, cm.options.keyMap, handle, cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var stopSeq = new Delayed;</span>&nbsp; <span class='diff-add'> function dispatchKey(cm, name, e, handle) {</span>&nbsp; <span class='diff-add'> var seq = cm.state.keySeq;</span>&nbsp; <span class='diff-add'> if (seq) {</span>&nbsp; <span class='diff-add'> if (isModifierKey(name)) return "handled";</span>&nbsp; <span class='diff-add'> stopSeq.set(50, function() {</span>&nbsp; <span class='diff-add'> if (cm.state.keySeq == seq) {</span>&nbsp; <span class='diff-add'> cm.state.keySeq = null;</span>&nbsp; <span class='diff-add'> resetInput(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> name = seq + " " + name;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var result = lookupKeyForEditor(cm, name, handle);</span>&nbsp; <span class='diff-add'> if (result == "multi")</span>&nbsp; <span class='diff-add'> cm.state.keySeq = name;</span>&nbsp; <span class='diff-add'> if (result == "handled")</span>&nbsp; <span class='diff-add'> signalLater(cm, "keyHandled", cm, name, e);</span>&nbsp; <span class='diff-add'> if (result == "handled" || result == "multi") {</span>&nbsp; <span class='diff-add'> e_preventDefault(e);</span>&nbsp; <span class='diff-add'> restartBlink(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (seq && !result && /\'$/.test(name)) {</span>&nbsp; <span class='diff-add'> e_preventDefault(e);</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return !!result;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Handle a key from the keydown event.</span>&nbsp; <span class='diff-add'> function handleKeyBinding(cm, e) {</span>&nbsp; <span class='diff-add'> var name = keyName(e, true);</span>&nbsp; <span class='diff-add'> if (!name) return false;</span>&nbsp; <span class='diff-add'> if (e.shiftKey && !cm.state.keySeq) {</span>&nbsp; <span class='diff-add'> // First try to resolve full name (including 'Shift-'). Failing</span>&nbsp; <span class='diff-add'> // that, see if there is a cursor-motion command (starting with</span>&nbsp; <span class='diff-add'> // 'go') bound to the keyname without 'Shift-'.</span>&nbsp; <span class='diff-add'> return dispatchKey(cm, "Shift-" + name, e, function(b) {return doHandleBinding(cm, b, true);})</span>&nbsp; <span class='diff-add'> || dispatchKey(cm, name, e, function(b) {</span>&nbsp; <span class='diff-add'> if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)</span>&nbsp; <span class='diff-add'> return doHandleBinding(cm, b);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return dispatchKey(cm, name, e, function(b) { return doHandleBinding(cm, b); });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Handle a key from the keypress event</span>&nbsp; <span class='diff-add'> function handleCharBinding(cm, e, ch) {</span>&nbsp; <span class='diff-add'> return dispatchKey(cm, "'" + ch + "'", e,</span>&nbsp; <span class='diff-add'> function(b) { return doHandleBinding(cm, b, true); });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lastStoppedKey = null;</span>&nbsp; <span class='diff-add'> function onKeyDown(e) {</span>&nbsp; <span class='diff-add'> var cm = this;</span>&nbsp; <span class='diff-add'> ensureFocus(cm);</span>&nbsp; <span class='diff-add'> if (signalDOMEvent(cm, e)) return;</span>&nbsp; <span class='diff-add'> // IE does strange things with escape.</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false;</span>&nbsp; <span class='diff-add'> var code = e.keyCode;</span>&nbsp; <span class='diff-add'> cm.display.shift = code == 16 || e.shiftKey;</span>&nbsp; <span class='diff-add'> var handled = handleKeyBinding(cm, e);</span>&nbsp; <span class='diff-add'> if (presto) {</span>&nbsp; <span class='diff-add'> lastStoppedKey = handled ? code : null;</span>&nbsp; <span class='diff-add'> // Opera has no cut event... we try to at least catch the key combo</span>&nbsp; <span class='diff-add'> if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))</span>&nbsp; <span class='diff-add'> cm.replaceSelection("", null, "cut");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Turn mouse into crosshair when Alt is held on Mac.</span>&nbsp; <span class='diff-add'> if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))</span>&nbsp; <span class='diff-add'> showCrossHair(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function showCrossHair(cm) {</span>&nbsp; <span class='diff-add'> var lineDiv = cm.display.lineDiv;</span>&nbsp; <span class='diff-add'> addClass(lineDiv, "CodeMirror-crosshair");</span>&nbsp; <span class='diff-add'> function up(e) {</span>&nbsp; <span class='diff-add'> if (e.keyCode == 18 || !e.altKey) {</span>&nbsp; <span class='diff-add'> rmClass(lineDiv, "CodeMirror-crosshair");</span>&nbsp; <span class='diff-add'> off(document, "keyup", up);</span>&nbsp; <span class='diff-add'> off(document, "mouseover", up);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> on(document, "keyup", up);</span>&nbsp; <span class='diff-add'> on(document, "mouseover", up);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function onKeyUp(e) {</span>&nbsp; <span class='diff-add'> if (e.keyCode == 16) this.doc.sel.shift = false;</span>&nbsp; <span class='diff-add'> signalDOMEvent(this, e);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function onKeyPress(e) {</span>&nbsp; <span class='diff-add'> var cm = this;</span>&nbsp; <span class='diff-add'> if (signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return;</span>&nbsp; <span class='diff-add'> var keyCode = e.keyCode, charCode = e.charCode;</span>&nbsp; <span class='diff-add'> if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}</span>&nbsp; <span class='diff-add'> if (((presto && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return;</span>&nbsp; <span class='diff-add'> var ch = String.fromCharCode(charCode == null ? keyCode : charCode);</span>&nbsp; <span class='diff-add'> if (handleCharBinding(cm, e, ch)) return;</span>&nbsp; <span class='diff-add'> if (ie && ie_version >= 9) cm.display.inputHasSelection = null;</span>&nbsp; <span class='diff-add'> fastPoll(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // FOCUS/BLUR EVENTS</span>&nbsp; <span class='diff-add'> function onFocus(cm) {</span>&nbsp; <span class='diff-add'> if (cm.options.readOnly == "nocursor") return;</span>&nbsp; <span class='diff-add'> if (!cm.state.focused) {</span>&nbsp; <span class='diff-add'> signal(cm, "focus", cm);</span>&nbsp; <span class='diff-add'> cm.state.focused = true;</span>&nbsp; <span class='diff-add'> addClass(cm.display.wrapper, "CodeMirror-focused");</span>&nbsp; <span class='diff-add'> // The prevInput test prevents this from firing when a context</span>&nbsp; <span class='diff-add'> // menu is closed (since the resetInput would kill the</span>&nbsp; <span class='diff-add'> // select-all detection hack)</span>&nbsp; <span class='diff-add'> if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {</span>&nbsp; <span class='diff-add'> resetInput(cm);</span>&nbsp; <span class='diff-add'> if (webkit) setTimeout(bind(resetInput, cm, true), 0); // Issue #1730</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> slowPoll(cm);</span>&nbsp; <span class='diff-add'> restartBlink(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function onBlur(cm) {</span>&nbsp; <span class='diff-add'> if (cm.state.focused) {</span>&nbsp; <span class='diff-add'> signal(cm, "blur", cm);</span>&nbsp; <span class='diff-add'> cm.state.focused = false;</span>&nbsp; <span class='diff-add'> rmClass(cm.display.wrapper, "CodeMirror-focused");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> clearInterval(cm.display.blinker);</span>&nbsp; <span class='diff-add'> setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // CONTEXT MENU HANDLING</span>&nbsp; <span class='diff-add'> // To make the context menu work, we need to briefly unhide the</span>&nbsp; <span class='diff-add'> // textarea (making it as unobtrusive as possible) to let the</span>&nbsp; <span class='diff-add'> // right-click take effect on it.</span>&nbsp; <span class='diff-add'> function onContextMenu(cm, e) {</span>&nbsp; <span class='diff-add'> if (signalDOMEvent(cm, e, "contextmenu")) return;</span>&nbsp; <span class='diff-add'> var display = cm.display;</span>&nbsp; <span class='diff-add'> if (eventInWidget(display, e) || contextMenuInGutter(cm, e)) return;</span>&nbsp; <span class='diff-add'> var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;</span>&nbsp; <span class='diff-add'> if (!pos || presto) return; // Opera is difficult.</span>&nbsp; <span class='diff-add'> // Reset the current text selection only if the click is done outside of the selection</span>&nbsp; <span class='diff-add'> // and 'resetSelectionOnContextMenu' option is true.</span>&nbsp; <span class='diff-add'> var reset = cm.options.resetSelectionOnContextMenu;</span>&nbsp; <span class='diff-add'> if (reset && cm.doc.sel.contains(pos) == -1)</span>&nbsp; <span class='diff-add'> operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll);</span>&nbsp; <span class='diff-add'> var oldCSS = display.input.style.cssText;</span>&nbsp; <span class='diff-add'> display.inputDiv.style.position = "absolute";</span>&nbsp; <span class='diff-add'> display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +</span>&nbsp; <span class='diff-add'> "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: " +</span>&nbsp; <span class='diff-add'> (ie ? "rgba(255, 255, 255, .05)" : "transparent") +</span>&nbsp; <span class='diff-add'> "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";</span>&nbsp; <span class='diff-add'> if (webkit) var oldScrollY = window.scrollY; // Work around Chrome issue (#2712)</span>&nbsp; <span class='diff-add'> focusInput(cm);</span>&nbsp; <span class='diff-add'> if (webkit) window.scrollTo(null, oldScrollY);</span>&nbsp; <span class='diff-add'> resetInput(cm);</span>&nbsp; <span class='diff-add'> // Adds "Select all" to context menu in FF</span>&nbsp; <span class='diff-add'> if (!cm.somethingSelected()) display.input.value = display.prevInput = " ";</span>&nbsp; <span class='diff-add'> display.contextMenuPending = true;</span>&nbsp; <span class='diff-add'> display.selForContextMenu = cm.doc.sel;</span>&nbsp; <span class='diff-add'> clearTimeout(display.detectingSelectAll);</span>&nbsp; <span class='diff-add'> // Select-all will be greyed out if there's nothing to select, so</span>&nbsp; <span class='diff-add'> // this adds a zero-width space so that we can later check whether</span>&nbsp; <span class='diff-add'> // it got selected.</span>&nbsp; <span class='diff-add'> function prepareSelectAllHack() {</span>&nbsp; <span class='diff-add'> if (display.input.selectionStart != null) {</span>&nbsp; <span class='diff-add'> var selected = cm.somethingSelected();</span>&nbsp; <span class='diff-add'> var extval = display.input.value = "\u200b" + (selected ? display.input.value : "");</span>&nbsp; <span class='diff-add'> display.prevInput = selected ? "" : "\u200b";</span>&nbsp; <span class='diff-add'> display.input.selectionStart = 1; display.input.selectionEnd = extval.length;</span>&nbsp; <span class='diff-add'> // Re-set this, in case some other handler touched the</span>&nbsp; <span class='diff-add'> // selection in the meantime.</span>&nbsp; <span class='diff-add'> display.selForContextMenu = cm.doc.sel;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function rehide() {</span>&nbsp; <span class='diff-add'> display.contextMenuPending = false;</span>&nbsp; <span class='diff-add'> display.inputDiv.style.position = "relative";</span>&nbsp; <span class='diff-add'> display.input.style.cssText = oldCSS;</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 9) display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos);</span>&nbsp; <span class='diff-add'> slowPoll(cm);</span>&nbsp; <span class='diff-add'> // Try to detect the user choosing select-all</span>&nbsp; <span class='diff-add'> if (display.input.selectionStart != null) {</span>&nbsp; <span class='diff-add'> if (!ie || (ie && ie_version < 9)) prepareSelectAllHack();</span>&nbsp; <span class='diff-add'> var i = 0, poll = function() {</span>&nbsp; <span class='diff-add'> if (display.selForContextMenu == cm.doc.sel && display.input.selectionStart == 0)</span>&nbsp; <span class='diff-add'> operation(cm, commands.selectAll)(cm);</span>&nbsp; <span class='diff-add'> else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);</span>&nbsp; <span class='diff-add'> else resetInput(cm);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> display.detectingSelectAll = setTimeout(poll, 200);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ie && ie_version >= 9) prepareSelectAllHack();</span>&nbsp; <span class='diff-add'> if (captureRightClick) {</span>&nbsp; <span class='diff-add'> e_stop(e);</span>&nbsp; <span class='diff-add'> var mouseup = function() {</span>&nbsp; <span class='diff-add'> off(window, "mouseup", mouseup);</span>&nbsp; <span class='diff-add'> setTimeout(rehide, 20);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> on(window, "mouseup", mouseup);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> setTimeout(rehide, 50);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function contextMenuInGutter(cm, e) {</span>&nbsp; <span class='diff-add'> if (!hasHandler(cm, "gutterContextMenu")) return false;</span>&nbsp; <span class='diff-add'> return gutterEvent(cm, e, "gutterContextMenu", false, signal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // UPDATING</span>&nbsp; <span class='diff-add'> // Compute the position of the end of a change (its 'to' property</span>&nbsp; <span class='diff-add'> // refers to the pre-change end).</span>&nbsp; <span class='diff-add'> var changeEnd = CodeMirror.changeEnd = function(change) {</span>&nbsp; <span class='diff-add'> if (!change.text) return change.to;</span>&nbsp; <span class='diff-add'> return Pos(change.from.line + change.text.length - 1,</span>&nbsp; <span class='diff-add'> lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Adjust a position to refer to the post-change position of the</span>&nbsp; <span class='diff-add'> // same text, or the end of the change if the change covers it.</span>&nbsp; <span class='diff-add'> function adjustForChange(pos, change) {</span>&nbsp; <span class='diff-add'> if (cmp(pos, change.from) < 0) return pos;</span>&nbsp; <span class='diff-add'> if (cmp(pos, change.to) <= 0) return changeEnd(change);</span>&nbsp; <span class='diff-add'> var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;</span>&nbsp; <span class='diff-add'> if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch;</span>&nbsp; <span class='diff-add'> return Pos(line, ch);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function computeSelAfterChange(doc, change) {</span>&nbsp; <span class='diff-add'> var out = [];</span>&nbsp; <span class='diff-add'> for (var i = 0; i < doc.sel.ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var range = doc.sel.ranges[i];</span>&nbsp; <span class='diff-add'> out.push(new Range(adjustForChange(range.anchor, change),</span>&nbsp; <span class='diff-add'> adjustForChange(range.head, change)));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return normalizeSelection(out, doc.sel.primIndex);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function offsetPos(pos, old, nw) {</span>&nbsp; <span class='diff-add'> if (pos.line == old.line)</span>&nbsp; <span class='diff-add'> return Pos(nw.line, pos.ch - old.ch + nw.ch);</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> return Pos(nw.line + (pos.line - old.line), pos.ch);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Used by replaceSelections to allow moving the selection to the</span>&nbsp; <span class='diff-add'> // start or around the replaced test. Hint may be "start" or "around".</span>&nbsp; <span class='diff-add'> function computeReplacedSel(doc, changes, hint) {</span>&nbsp; <span class='diff-add'> var out = [];</span>&nbsp; <span class='diff-add'> var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < changes.length; i++) {</span>&nbsp; <span class='diff-add'> var change = changes[i];</span>&nbsp; <span class='diff-add'> var from = offsetPos(change.from, oldPrev, newPrev);</span>&nbsp; <span class='diff-add'> var to = offsetPos(changeEnd(change), oldPrev, newPrev);</span>&nbsp; <span class='diff-add'> oldPrev = change.to;</span>&nbsp; <span class='diff-add'> newPrev = to;</span>&nbsp; <span class='diff-add'> if (hint == "around") {</span>&nbsp; <span class='diff-add'> var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;</span>&nbsp; <span class='diff-add'> out[i] = new Range(inv ? to : from, inv ? from : to);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> out[i] = new Range(from, from);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return new Selection(out, doc.sel.primIndex);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Allow "beforeChange" event handlers to influence a change</span>&nbsp; <span class='diff-add'> function filterChange(doc, change, update) {</span>&nbsp; <span class='diff-add'> var obj = {</span>&nbsp; <span class='diff-add'> canceled: false,</span>&nbsp; <span class='diff-add'> from: change.from,</span>&nbsp; <span class='diff-add'> to: change.to,</span>&nbsp; <span class='diff-add'> text: change.text,</span>&nbsp; <span class='diff-add'> origin: change.origin,</span>&nbsp; <span class='diff-add'> cancel: function() { this.canceled = true; }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (update) obj.update = function(from, to, text, origin) {</span>&nbsp; <span class='diff-add'> if (from) this.from = clipPos(doc, from);</span>&nbsp; <span class='diff-add'> if (to) this.to = clipPos(doc, to);</span>&nbsp; <span class='diff-add'> if (text) this.text = text;</span>&nbsp; <span class='diff-add'> if (origin !== undefined) this.origin = origin;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> signal(doc, "beforeChange", doc, obj);</span>&nbsp; <span class='diff-add'> if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj);</span>&nbsp; <span class='diff-add'> if (obj.canceled) return null;</span>&nbsp; <span class='diff-add'> return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Apply a change to a document, and add it to the document's</span>&nbsp; <span class='diff-add'> // history, and propagating it to all linked documents.</span>&nbsp; <span class='diff-add'> function makeChange(doc, change, ignoreReadOnly) {</span>&nbsp; <span class='diff-add'> if (doc.cm) {</span>&nbsp; <span class='diff-add'> if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly);</span>&nbsp; <span class='diff-add'> if (doc.cm.state.suppressEdits) return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {</span>&nbsp; <span class='diff-add'> change = filterChange(doc, change, true);</span>&nbsp; <span class='diff-add'> if (!change) return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Possibly split or suppress the update based on the presence</span>&nbsp; <span class='diff-add'> // of read-only spans in its range.</span>&nbsp; <span class='diff-add'> var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);</span>&nbsp; <span class='diff-add'> if (split) {</span>&nbsp; <span class='diff-add'> for (var i = split.length - 1; i >= 0; --i)</span>&nbsp; <span class='diff-add'> makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text});</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> makeChangeInner(doc, change);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function makeChangeInner(doc, change) {</span>&nbsp; <span class='diff-add'> if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) return;</span>&nbsp; <span class='diff-add'> var selAfter = computeSelAfterChange(doc, change);</span>&nbsp; <span class='diff-add'> addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);</span>&nbsp; <span class='diff-add'> makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));</span>&nbsp; <span class='diff-add'> var rebased = [];</span>&nbsp; <span class='diff-add'> linkedDocs(doc, function(doc, sharedHist) {</span>&nbsp; <span class='diff-add'> if (!sharedHist && indexOf(rebased, doc.history) == -1) {</span>&nbsp; <span class='diff-add'> rebaseHist(doc.history, change);</span>&nbsp; <span class='diff-add'> rebased.push(doc.history);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Revert a change stored in a document's history.</span>&nbsp; <span class='diff-add'> function makeChangeFromHistory(doc, type, allowSelectionOnly) {</span>&nbsp; <span class='diff-add'> if (doc.cm && doc.cm.state.suppressEdits) return;</span>&nbsp; <span class='diff-add'> var hist = doc.history, event, selAfter = doc.sel;</span>&nbsp; <span class='diff-add'> var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;</span>&nbsp; <span class='diff-add'> // Verify that there is a useable event (so that ctrl-z won't</span>&nbsp; <span class='diff-add'> // needlessly clear selection events)</span>&nbsp; <span class='diff-add'> for (var i = 0; i < source.length; i++) {</span>&nbsp; <span class='diff-add'> event = source[i];</span>&nbsp; <span class='diff-add'> if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (i == source.length) return;</span>&nbsp; <span class='diff-add'> hist.lastOrigin = hist.lastSelOrigin = null;</span>&nbsp; <span class='diff-add'> for (;;) {</span>&nbsp; <span class='diff-add'> event = source.pop();</span>&nbsp; <span class='diff-add'> if (event.ranges) {</span>&nbsp; <span class='diff-add'> pushSelectionToHistory(event, dest);</span>&nbsp; <span class='diff-add'> if (allowSelectionOnly && !event.equals(doc.sel)) {</span>&nbsp; <span class='diff-add'> setSelection(doc, event, {clearRedo: false});</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> selAfter = event;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Build up a reverse change object to add to the opposite history</span>&nbsp; <span class='diff-add'> // stack (redo when undoing, and vice versa).</span>&nbsp; <span class='diff-add'> var antiChanges = [];</span>&nbsp; <span class='diff-add'> pushSelectionToHistory(selAfter, dest);</span>&nbsp; <span class='diff-add'> dest.push({changes: antiChanges, generation: hist.generation});</span>&nbsp; <span class='diff-add'> hist.generation = event.generation || ++hist.maxGeneration;</span>&nbsp; <span class='diff-add'> var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");</span>&nbsp; <span class='diff-add'> for (var i = event.changes.length - 1; i >= 0; --i) {</span>&nbsp; <span class='diff-add'> var change = event.changes[i];</span>&nbsp; <span class='diff-add'> change.origin = type;</span>&nbsp; <span class='diff-add'> if (filter && !filterChange(doc, change, false)) {</span>&nbsp; <span class='diff-add'> source.length = 0;</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> antiChanges.push(historyChangeFromChange(doc, change));</span>&nbsp; <span class='diff-add'> var after = i ? computeSelAfterChange(doc, change) : lst(source);</span>&nbsp; <span class='diff-add'> makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));</span>&nbsp; <span class='diff-add'> if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)});</span>&nbsp; <span class='diff-add'> var rebased = [];</span>&nbsp; <span class='diff-add'> // Propagate to the linked documents</span>&nbsp; <span class='diff-add'> linkedDocs(doc, function(doc, sharedHist) {</span>&nbsp; <span class='diff-add'> if (!sharedHist && indexOf(rebased, doc.history) == -1) {</span>&nbsp; <span class='diff-add'> rebaseHist(doc.history, change);</span>&nbsp; <span class='diff-add'> rebased.push(doc.history);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Sub-views need their line numbers shifted when text is added</span>&nbsp; <span class='diff-add'> // above or below them in the parent document.</span>&nbsp; <span class='diff-add'> function shiftDoc(doc, distance) {</span>&nbsp; <span class='diff-add'> if (distance == 0) return;</span>&nbsp; <span class='diff-add'> doc.first += distance;</span>&nbsp; <span class='diff-add'> doc.sel = new Selection(map(doc.sel.ranges, function(range) {</span>&nbsp; <span class='diff-add'> return new Range(Pos(range.anchor.line + distance, range.anchor.ch),</span>&nbsp; <span class='diff-add'> Pos(range.head.line + distance, range.head.ch));</span>&nbsp; <span class='diff-add'> }), doc.sel.primIndex);</span>&nbsp; <span class='diff-add'> if (doc.cm) {</span>&nbsp; <span class='diff-add'> regChange(doc.cm, doc.first, doc.first - distance, distance);</span>&nbsp; <span class='diff-add'> for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)</span>&nbsp; <span class='diff-add'> regLineChange(doc.cm, l, "gutter");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // More lower-level change function, handling only a single document</span>&nbsp; <span class='diff-add'> // (not linked ones).</span>&nbsp; <span class='diff-add'> function makeChangeSingleDoc(doc, change, selAfter, spans) {</span>&nbsp; <span class='diff-add'> if (doc.cm && !doc.cm.curOp)</span>&nbsp; <span class='diff-add'> return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);</span>&nbsp; <span class='diff-add'> if (change.to.line < doc.first) {</span>&nbsp; <span class='diff-add'> shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (change.from.line > doc.lastLine()) return;</span>&nbsp; <span class='diff-add'> // Clip the change to the size of this doc</span>&nbsp; <span class='diff-add'> if (change.from.line < doc.first) {</span>&nbsp; <span class='diff-add'> var shift = change.text.length - 1 - (doc.first - change.from.line);</span>&nbsp; <span class='diff-add'> shiftDoc(doc, shift);</span>&nbsp; <span class='diff-add'> change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),</span>&nbsp; <span class='diff-add'> text: [lst(change.text)], origin: change.origin};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var last = doc.lastLine();</span>&nbsp; <span class='diff-add'> if (change.to.line > last) {</span>&nbsp; <span class='diff-add'> change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),</span>&nbsp; <span class='diff-add'> text: [change.text[0]], origin: change.origin};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> change.removed = getBetween(doc, change.from, change.to);</span>&nbsp; <span class='diff-add'> if (!selAfter) selAfter = computeSelAfterChange(doc, change);</span>&nbsp; <span class='diff-add'> if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans);</span>&nbsp; <span class='diff-add'> else updateDoc(doc, change, spans);</span>&nbsp; <span class='diff-add'> setSelectionNoUndo(doc, selAfter, sel_dontScroll);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Handle the interaction of a change to a document with the editor</span>&nbsp; <span class='diff-add'> // that this document is part of.</span>&nbsp; <span class='diff-add'> function makeChangeSingleDocInEditor(cm, change, spans) {</span>&nbsp; <span class='diff-add'> var doc = cm.doc, display = cm.display, from = change.from, to = change.to;</span>&nbsp; <span class='diff-add'> var recomputeMaxLength = false, checkWidthStart = from.line;</span>&nbsp; <span class='diff-add'> if (!cm.options.lineWrapping) {</span>&nbsp; <span class='diff-add'> checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));</span>&nbsp; <span class='diff-add'> doc.iter(checkWidthStart, to.line + 1, function(line) {</span>&nbsp; <span class='diff-add'> if (line == display.maxLine) {</span>&nbsp; <span class='diff-add'> recomputeMaxLength = true;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (doc.sel.contains(change.from, change.to) > -1)</span>&nbsp; <span class='diff-add'> signalCursorActivity(cm);</span>&nbsp; <span class='diff-add'> updateDoc(doc, change, spans, estimateHeight(cm));</span>&nbsp; <span class='diff-add'> if (!cm.options.lineWrapping) {</span>&nbsp; <span class='diff-add'> doc.iter(checkWidthStart, from.line + change.text.length, function(line) {</span>&nbsp; <span class='diff-add'> var len = lineLength(line);</span>&nbsp; <span class='diff-add'> if (len > display.maxLineLength) {</span>&nbsp; <span class='diff-add'> display.maxLine = line;</span>&nbsp; <span class='diff-add'> display.maxLineLength = len;</span>&nbsp; <span class='diff-add'> display.maxLineChanged = true;</span>&nbsp; <span class='diff-add'> recomputeMaxLength = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (recomputeMaxLength) cm.curOp.updateMaxLine = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Adjust frontier, schedule worker</span>&nbsp; <span class='diff-add'> doc.frontier = Math.min(doc.frontier, from.line);</span>&nbsp; <span class='diff-add'> startWorker(cm, 400);</span>&nbsp; <span class='diff-add'> var lendiff = change.text.length - (to.line - from.line) - 1;</span>&nbsp; <span class='diff-add'> // Remember that these lines changed, for updating the display</span>&nbsp; <span class='diff-add'> if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))</span>&nbsp; <span class='diff-add'> regLineChange(cm, from.line, "text");</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> regChange(cm, from.line, to.line + 1, lendiff);</span>&nbsp; <span class='diff-add'> var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");</span>&nbsp; <span class='diff-add'> if (changeHandler || changesHandler) {</span>&nbsp; <span class='diff-add'> var obj = {</span>&nbsp; <span class='diff-add'> from: from, to: to,</span>&nbsp; <span class='diff-add'> text: change.text,</span>&nbsp; <span class='diff-add'> removed: change.removed,</span>&nbsp; <span class='diff-add'> origin: change.origin</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (changeHandler) signalLater(cm, "change", cm, obj);</span>&nbsp; <span class='diff-add'> if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.display.selForContextMenu = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function replaceRange(doc, code, from, to, origin) {</span>&nbsp; <span class='diff-add'> if (!to) to = from;</span>&nbsp; <span class='diff-add'> if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }</span>&nbsp; <span class='diff-add'> if (typeof code == "string") code = splitLines(code);</span>&nbsp; <span class='diff-add'> makeChange(doc, {from: from, to: to, text: code, origin: origin});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // SCROLLING THINGS INTO VIEW</span>&nbsp; <span class='diff-add'> // If an editor sits on the top or bottom of the window, partially</span>&nbsp; <span class='diff-add'> // scrolled out of view, this ensures that the cursor is visible.</span>&nbsp; <span class='diff-add'> function maybeScrollWindow(cm, coords) {</span>&nbsp; <span class='diff-add'> if (signalDOMEvent(cm, "scrollCursorIntoView")) return;</span>&nbsp; <span class='diff-add'> var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;</span>&nbsp; <span class='diff-add'> if (coords.top + box.top < 0) doScroll = true;</span>&nbsp; <span class='diff-add'> else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;</span>&nbsp; <span class='diff-add'> if (doScroll != null && !phantom) {</span>&nbsp; <span class='diff-add'> var scrollNode = elt("div", "\u200b", null, "position: absolute; top: " +</span>&nbsp; <span class='diff-add'> (coords.top - display.viewOffset - paddingTop(cm.display)) + "px; height: " +</span>&nbsp; <span class='diff-add'> (coords.bottom - coords.top + scrollGap(cm) + display.barHeight) + "px; left: " +</span>&nbsp; <span class='diff-add'> coords.left + "px; width: 2px;");</span>&nbsp; <span class='diff-add'> cm.display.lineSpace.appendChild(scrollNode);</span>&nbsp; <span class='diff-add'> scrollNode.scrollIntoView(doScroll);</span>&nbsp; <span class='diff-add'> cm.display.lineSpace.removeChild(scrollNode);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Scroll a given position into view (immediately), verifying that</span>&nbsp; <span class='diff-add'> // it actually became visible (as line heights are accurately</span>&nbsp; <span class='diff-add'> // measured, the position of something may 'drift' during drawing).</span>&nbsp; <span class='diff-add'> function scrollPosIntoView(cm, pos, end, margin) {</span>&nbsp; <span class='diff-add'> if (margin == null) margin = 0;</span>&nbsp; <span class='diff-add'> for (var limit = 0; limit < 5; limit++) {</span>&nbsp; <span class='diff-add'> var changed = false, coords = cursorCoords(cm, pos);</span>&nbsp; <span class='diff-add'> var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);</span>&nbsp; <span class='diff-add'> var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),</span>&nbsp; <span class='diff-add'> Math.min(coords.top, endCoords.top) - margin,</span>&nbsp; <span class='diff-add'> Math.max(coords.left, endCoords.left),</span>&nbsp; <span class='diff-add'> Math.max(coords.bottom, endCoords.bottom) + margin);</span>&nbsp; <span class='diff-add'> var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;</span>&nbsp; <span class='diff-add'> if (scrollPos.scrollTop != null) {</span>&nbsp; <span class='diff-add'> setScrollTop(cm, scrollPos.scrollTop);</span>&nbsp; <span class='diff-add'> if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (scrollPos.scrollLeft != null) {</span>&nbsp; <span class='diff-add'> setScrollLeft(cm, scrollPos.scrollLeft);</span>&nbsp; <span class='diff-add'> if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!changed) break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return coords;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Scroll a given set of coordinates into view (immediately).</span>&nbsp; <span class='diff-add'> function scrollIntoView(cm, x1, y1, x2, y2) {</span>&nbsp; <span class='diff-add'> var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);</span>&nbsp; <span class='diff-add'> if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);</span>&nbsp; <span class='diff-add'> if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Calculate a new scroll position needed to scroll the given</span>&nbsp; <span class='diff-add'> // rectangle into view. Returns an object with scrollTop and</span>&nbsp; <span class='diff-add'> // scrollLeft properties. When these are undefined, the</span>&nbsp; <span class='diff-add'> // vertical/horizontal position does not need to be adjusted.</span>&nbsp; <span class='diff-add'> function calculateScrollPos(cm, x1, y1, x2, y2) {</span>&nbsp; <span class='diff-add'> var display = cm.display, snapMargin = textHeight(cm.display);</span>&nbsp; <span class='diff-add'> if (y1 < 0) y1 = 0;</span>&nbsp; <span class='diff-add'> var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;</span>&nbsp; <span class='diff-add'> var screen = displayHeight(cm), result = {};</span>&nbsp; <span class='diff-add'> if (y2 - y1 > screen) y2 = y1 + screen;</span>&nbsp; <span class='diff-add'> var docBottom = cm.doc.height + paddingVert(display);</span>&nbsp; <span class='diff-add'> var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;</span>&nbsp; <span class='diff-add'> if (y1 < screentop) {</span>&nbsp; <span class='diff-add'> result.scrollTop = atTop ? 0 : y1;</span>&nbsp; <span class='diff-add'> } else if (y2 > screentop + screen) {</span>&nbsp; <span class='diff-add'> var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);</span>&nbsp; <span class='diff-add'> if (newTop != screentop) result.scrollTop = newTop;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;</span>&nbsp; <span class='diff-add'> var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);</span>&nbsp; <span class='diff-add'> var tooWide = x2 - x1 > screenw;</span>&nbsp; <span class='diff-add'> if (tooWide) x2 = x1 + screenw;</span>&nbsp; <span class='diff-add'> if (x1 < 10)</span>&nbsp; <span class='diff-add'> result.scrollLeft = 0;</span>&nbsp; <span class='diff-add'> else if (x1 < screenleft)</span>&nbsp; <span class='diff-add'> result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10));</span>&nbsp; <span class='diff-add'> else if (x2 > screenw + screenleft - 3)</span>&nbsp; <span class='diff-add'> result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw;</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Store a relative adjustment to the scroll position in the current</span>&nbsp; <span class='diff-add'> // operation (to be applied when the operation finishes).</span>&nbsp; <span class='diff-add'> function addToScrollPos(cm, left, top) {</span>&nbsp; <span class='diff-add'> if (left != null || top != null) resolveScrollToPos(cm);</span>&nbsp; <span class='diff-add'> if (left != null)</span>&nbsp; <span class='diff-add'> cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;</span>&nbsp; <span class='diff-add'> if (top != null)</span>&nbsp; <span class='diff-add'> cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Make sure that at the end of the operation the current cursor is</span>&nbsp; <span class='diff-add'> // shown.</span>&nbsp; <span class='diff-add'> function ensureCursorVisible(cm) {</span>&nbsp; <span class='diff-add'> resolveScrollToPos(cm);</span>&nbsp; <span class='diff-add'> var cur = cm.getCursor(), from = cur, to = cur;</span>&nbsp; <span class='diff-add'> if (!cm.options.lineWrapping) {</span>&nbsp; <span class='diff-add'> from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;</span>&nbsp; <span class='diff-add'> to = Pos(cur.line, cur.ch + 1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // When an operation has its scrollToPos property set, and another</span>&nbsp; <span class='diff-add'> // scroll action is applied before the end of the operation, this</span>&nbsp; <span class='diff-add'> // 'simulates' scrolling that position into view in a cheap way, so</span>&nbsp; <span class='diff-add'> // that the effect of intermediate scroll commands is not ignored.</span>&nbsp; <span class='diff-add'> function resolveScrollToPos(cm) {</span>&nbsp; <span class='diff-add'> var range = cm.curOp.scrollToPos;</span>&nbsp; <span class='diff-add'> if (range) {</span>&nbsp; <span class='diff-add'> cm.curOp.scrollToPos = null;</span>&nbsp; <span class='diff-add'> var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);</span>&nbsp; <span class='diff-add'> var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),</span>&nbsp; <span class='diff-add'> Math.min(from.top, to.top) - range.margin,</span>&nbsp; <span class='diff-add'> Math.max(from.right, to.right),</span>&nbsp; <span class='diff-add'> Math.max(from.bottom, to.bottom) + range.margin);</span>&nbsp; <span class='diff-add'> cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // API UTILITIES</span>&nbsp; <span class='diff-add'> // Indent the given line. The how parameter can be "smart",</span>&nbsp; <span class='diff-add'> // "add"/null, "subtract", or "prev". When aggressive is false</span>&nbsp; <span class='diff-add'> // (typically set to true for forced single-line indents), empty</span>&nbsp; <span class='diff-add'> // lines are not indented, and places where the mode returns Pass</span>&nbsp; <span class='diff-add'> // are left alone.</span>&nbsp; <span class='diff-add'> function indentLine(cm, n, how, aggressive) {</span>&nbsp; <span class='diff-add'> var doc = cm.doc, state;</span>&nbsp; <span class='diff-add'> if (how == null) how = "add";</span>&nbsp; <span class='diff-add'> if (how == "smart") {</span>&nbsp; <span class='diff-add'> // Fall back to "prev" when the mode doesn't have an indentation</span>&nbsp; <span class='diff-add'> // method.</span>&nbsp; <span class='diff-add'> if (!doc.mode.indent) how = "prev";</span>&nbsp; <span class='diff-add'> else state = getStateBefore(cm, n);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var tabSize = cm.options.tabSize;</span>&nbsp; <span class='diff-add'> var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);</span>&nbsp; <span class='diff-add'> if (line.stateAfter) line.stateAfter = null;</span>&nbsp; <span class='diff-add'> var curSpaceString = line.text.match(/^\s*/)[0], indentation;</span>&nbsp; <span class='diff-add'> if (!aggressive && !/\S/.test(line.text)) {</span>&nbsp; <span class='diff-add'> indentation = 0;</span>&nbsp; <span class='diff-add'> how = "not";</span>&nbsp; <span class='diff-add'> } else if (how == "smart") {</span>&nbsp; <span class='diff-add'> indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);</span>&nbsp; <span class='diff-add'> if (indentation == Pass || indentation > 150) {</span>&nbsp; <span class='diff-add'> if (!aggressive) return;</span>&nbsp; <span class='diff-add'> how = "prev";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (how == "prev") {</span>&nbsp; <span class='diff-add'> if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);</span>&nbsp; <span class='diff-add'> else indentation = 0;</span>&nbsp; <span class='diff-add'> } else if (how == "add") {</span>&nbsp; <span class='diff-add'> indentation = curSpace + cm.options.indentUnit;</span>&nbsp; <span class='diff-add'> } else if (how == "subtract") {</span>&nbsp; <span class='diff-add'> indentation = curSpace - cm.options.indentUnit;</span>&nbsp; <span class='diff-add'> } else if (typeof how == "number") {</span>&nbsp; <span class='diff-add'> indentation = curSpace + how;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> indentation = Math.max(0, indentation);</span>&nbsp; <span class='diff-add'> var indentString = "", pos = 0;</span>&nbsp; <span class='diff-add'> if (cm.options.indentWithTabs)</span>&nbsp; <span class='diff-add'> for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";}</span>&nbsp; <span class='diff-add'> if (pos < indentation) indentString += spaceStr(indentation - pos);</span>&nbsp; <span class='diff-add'> if (indentString != curSpaceString) {</span>&nbsp; <span class='diff-add'> replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // Ensure that, if the cursor was in the whitespace at the start</span>&nbsp; <span class='diff-add'> // of the line, it is moved to the end of that space.</span>&nbsp; <span class='diff-add'> for (var i = 0; i < doc.sel.ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var range = doc.sel.ranges[i];</span>&nbsp; <span class='diff-add'> if (range.head.line == n && range.head.ch < curSpaceString.length) {</span>&nbsp; <span class='diff-add'> var pos = Pos(n, curSpaceString.length);</span>&nbsp; <span class='diff-add'> replaceOneSelection(doc, i, new Range(pos, pos));</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> line.stateAfter = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Utility for applying a change to a line by handle or number,</span>&nbsp; <span class='diff-add'> // returning the number and optionally registering the line as</span>&nbsp; <span class='diff-add'> // changed.</span>&nbsp; <span class='diff-add'> function changeLine(doc, handle, changeType, op) {</span>&nbsp; <span class='diff-add'> var no = handle, line = handle;</span>&nbsp; <span class='diff-add'> if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle));</span>&nbsp; <span class='diff-add'> else no = lineNo(handle);</span>&nbsp; <span class='diff-add'> if (no == null) return null;</span>&nbsp; <span class='diff-add'> if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType);</span>&nbsp; <span class='diff-add'> return line;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Helper for deleting text near the selection(s), used to implement</span>&nbsp; <span class='diff-add'> // backspace, delete, and similar functionality.</span>&nbsp; <span class='diff-add'> function deleteNearSelection(cm, compute) {</span>&nbsp; <span class='diff-add'> var ranges = cm.doc.sel.ranges, kill = [];</span>&nbsp; <span class='diff-add'> // Build up a set of ranges to kill first, merging overlapping</span>&nbsp; <span class='diff-add'> // ranges.</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var toKill = compute(ranges[i]);</span>&nbsp; <span class='diff-add'> while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {</span>&nbsp; <span class='diff-add'> var replaced = kill.pop();</span>&nbsp; <span class='diff-add'> if (cmp(replaced.from, toKill.from) < 0) {</span>&nbsp; <span class='diff-add'> toKill.from = replaced.from;</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> kill.push(toKill);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Next, remove those actual ranges.</span>&nbsp; <span class='diff-add'> runInOp(cm, function() {</span>&nbsp; <span class='diff-add'> for (var i = kill.length - 1; i >= 0; i--)</span>&nbsp; <span class='diff-add'> replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete");</span>&nbsp; <span class='diff-add'> ensureCursorVisible(cm);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Used for horizontal relative motion. Dir is -1 or 1 (left or</span>&nbsp; <span class='diff-add'> // right), unit can be "char", "column" (like char, but doesn't</span>&nbsp; <span class='diff-add'> // cross line boundaries), "word" (across next word), or "group" (to</span>&nbsp; <span class='diff-add'> // the start of next group of word or non-word-non-whitespace</span>&nbsp; <span class='diff-add'> // chars). The visually param controls whether, in right-to-left</span>&nbsp; <span class='diff-add'> // text, direction 1 means to move towards the next index in the</span>&nbsp; <span class='diff-add'> // string, or towards the character to the right of the current</span>&nbsp; <span class='diff-add'> // position. The resulting position will have a hitSide=true</span>&nbsp; <span class='diff-add'> // property if it reached the end of the document.</span>&nbsp; <span class='diff-add'> function findPosH(doc, pos, dir, unit, visually) {</span>&nbsp; <span class='diff-add'> var line = pos.line, ch = pos.ch, origDir = dir;</span>&nbsp; <span class='diff-add'> var lineObj = getLine(doc, line);</span>&nbsp; <span class='diff-add'> var possible = true;</span>&nbsp; <span class='diff-add'> function findNextLine() {</span>&nbsp; <span class='diff-add'> var l = line + dir;</span>&nbsp; <span class='diff-add'> if (l < doc.first || l >= doc.first + doc.size) return (possible = false);</span>&nbsp; <span class='diff-add'> line = l;</span>&nbsp; <span class='diff-add'> return lineObj = getLine(doc, l);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function moveOnce(boundToLine) {</span>&nbsp; <span class='diff-add'> var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);</span>&nbsp; <span class='diff-add'> if (next == null) {</span>&nbsp; <span class='diff-add'> if (!boundToLine && findNextLine()) {</span>&nbsp; <span class='diff-add'> if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);</span>&nbsp; <span class='diff-add'> else ch = dir < 0 ? lineObj.text.length : 0;</span>&nbsp; <span class='diff-add'> } else return (possible = false);</span>&nbsp; <span class='diff-add'> } else ch = next;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (unit == "char") moveOnce();</span>&nbsp; <span class='diff-add'> else if (unit == "column") moveOnce(true);</span>&nbsp; <span class='diff-add'> else if (unit == "word" || unit == "group") {</span>&nbsp; <span class='diff-add'> var sawType = null, group = unit == "group";</span>&nbsp; <span class='diff-add'> var helper = doc.cm && doc.cm.getHelper(pos, "wordChars");</span>&nbsp; <span class='diff-add'> for (var first = true;; first = false) {</span>&nbsp; <span class='diff-add'> if (dir < 0 && !moveOnce(!first)) break;</span>&nbsp; <span class='diff-add'> var cur = lineObj.text.charAt(ch) || "\n";</span>&nbsp; <span class='diff-add'> var type = isWordChar(cur, helper) ? "w"</span>&nbsp; <span class='diff-add'> : group && cur == "\n" ? "n"</span>&nbsp; <span class='diff-add'> : !group || /\s/.test(cur) ? null</span>&nbsp; <span class='diff-add'> : "p";</span>&nbsp; <span class='diff-add'> if (group && !first && !type) type = "s";</span>&nbsp; <span class='diff-add'> if (sawType && sawType != type) {</span>&nbsp; <span class='diff-add'> if (dir < 0) {dir = 1; moveOnce();}</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (type) sawType = type;</span>&nbsp; <span class='diff-add'> if (dir > 0 && !moveOnce(!first)) break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var result = skipAtomic(doc, Pos(line, ch), origDir, true);</span>&nbsp; <span class='diff-add'> if (!possible) result.hitSide = true;</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // For relative vertical movement. Dir may be -1 or 1. Unit can be</span>&nbsp; <span class='diff-add'> // "page" or "line". The resulting position will have a hitSide=true</span>&nbsp; <span class='diff-add'> // property if it reached the end of the document.</span>&nbsp; <span class='diff-add'> function findPosV(cm, pos, dir, unit) {</span>&nbsp; <span class='diff-add'> var doc = cm.doc, x = pos.left, y;</span>&nbsp; <span class='diff-add'> if (unit == "page") {</span>&nbsp; <span class='diff-add'> var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);</span>&nbsp; <span class='diff-add'> y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));</span>&nbsp; <span class='diff-add'> } else if (unit == "line") {</span>&nbsp; <span class='diff-add'> y = dir > 0 ? pos.bottom + 3 : pos.top - 3;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (;;) {</span>&nbsp; <span class='diff-add'> var target = coordsChar(cm, x, y);</span>&nbsp; <span class='diff-add'> if (!target.outside) break;</span>&nbsp; <span class='diff-add'> if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }</span>&nbsp; <span class='diff-add'> y += dir * 5;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return target;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // EDITOR METHODS</span>&nbsp; <span class='diff-add'> // The publicly visible API. Note that methodOp(f) means</span>&nbsp; <span class='diff-add'> // 'wrap f in an operation, performed on its `this` parameter'.</span>&nbsp; <span class='diff-add'> // This is not the complete set of editor methods. Most of the</span>&nbsp; <span class='diff-add'> // methods defined on the Doc type are also injected into</span>&nbsp; <span class='diff-add'> // CodeMirror.prototype, for backwards compatibility and</span>&nbsp; <span class='diff-add'> // convenience.</span>&nbsp; <span class='diff-add'> CodeMirror.prototype = {</span>&nbsp; <span class='diff-add'> constructor: CodeMirror,</span>&nbsp; <span class='diff-add'> focus: function(){window.focus(); focusInput(this); fastPoll(this);},</span>&nbsp; <span class='diff-add'> setOption: function(option, value) {</span>&nbsp; <span class='diff-add'> var options = this.options, old = options[option];</span>&nbsp; <span class='diff-add'> if (options[option] == value && option != "mode") return;</span>&nbsp; <span class='diff-add'> options[option] = value;</span>&nbsp; <span class='diff-add'> if (optionHandlers.hasOwnProperty(option))</span>&nbsp; <span class='diff-add'> operation(this, optionHandlers[option])(this, value, old);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getOption: function(option) {return this.options[option];},</span>&nbsp; <span class='diff-add'> getDoc: function() {return this.doc;},</span>&nbsp; <span class='diff-add'> addKeyMap: function(map, bottom) {</span>&nbsp; <span class='diff-add'> this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> removeKeyMap: function(map) {</span>&nbsp; <span class='diff-add'> var maps = this.state.keyMaps;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < maps.length; ++i)</span>&nbsp; <span class='diff-add'> if (maps[i] == map || maps[i].name == map) {</span>&nbsp; <span class='diff-add'> maps.splice(i, 1);</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> addOverlay: methodOp(function(spec, options) {</span>&nbsp; <span class='diff-add'> var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);</span>&nbsp; <span class='diff-add'> if (mode.startState) throw new Error("Overlays may not be stateful.");</span>&nbsp; <span class='diff-add'> this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});</span>&nbsp; <span class='diff-add'> this.state.modeGen++;</span>&nbsp; <span class='diff-add'> regChange(this);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> removeOverlay: methodOp(function(spec) {</span>&nbsp; <span class='diff-add'> var overlays = this.state.overlays;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < overlays.length; ++i) {</span>&nbsp; <span class='diff-add'> var cur = overlays[i].modeSpec;</span>&nbsp; <span class='diff-add'> if (cur == spec || typeof spec == "string" && cur.name == spec) {</span>&nbsp; <span class='diff-add'> overlays.splice(i, 1);</span>&nbsp; <span class='diff-add'> this.state.modeGen++;</span>&nbsp; <span class='diff-add'> regChange(this);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> indentLine: methodOp(function(n, dir, aggressive) {</span>&nbsp; <span class='diff-add'> if (typeof dir != "string" && typeof dir != "number") {</span>&nbsp; <span class='diff-add'> if (dir == null) dir = this.options.smartIndent ? "smart" : "prev";</span>&nbsp; <span class='diff-add'> else dir = dir ? "add" : "subtract";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> indentSelection: methodOp(function(how) {</span>&nbsp; <span class='diff-add'> var ranges = this.doc.sel.ranges, end = -1;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var range = ranges[i];</span>&nbsp; <span class='diff-add'> if (!range.empty()) {</span>&nbsp; <span class='diff-add'> var from = range.from(), to = range.to();</span>&nbsp; <span class='diff-add'> var start = Math.max(end, from.line);</span>&nbsp; <span class='diff-add'> end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;</span>&nbsp; <span class='diff-add'> for (var j = start; j < end; ++j)</span>&nbsp; <span class='diff-add'> indentLine(this, j, how);</span>&nbsp; <span class='diff-add'> var newRanges = this.doc.sel.ranges;</span>&nbsp; <span class='diff-add'> if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)</span>&nbsp; <span class='diff-add'> replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll);</span>&nbsp; <span class='diff-add'> } else if (range.head.line > end) {</span>&nbsp; <span class='diff-add'> indentLine(this, range.head.line, how, true);</span>&nbsp; <span class='diff-add'> end = range.head.line;</span>&nbsp; <span class='diff-add'> if (i == this.doc.sel.primIndex) ensureCursorVisible(this);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> // Fetch the parser token for a given character. Useful for hacks</span>&nbsp; <span class='diff-add'> // that want to inspect the mode state (say, for completion).</span>&nbsp; <span class='diff-add'> getTokenAt: function(pos, precise) {</span>&nbsp; <span class='diff-add'> return takeToken(this, pos, precise);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getLineTokens: function(line, precise) {</span>&nbsp; <span class='diff-add'> return takeToken(this, Pos(line), precise, true);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getTokenTypeAt: function(pos) {</span>&nbsp; <span class='diff-add'> pos = clipPos(this.doc, pos);</span>&nbsp; <span class='diff-add'> var styles = getLineStyles(this, getLine(this.doc, pos.line));</span>&nbsp; <span class='diff-add'> var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;</span>&nbsp; <span class='diff-add'> var type;</span>&nbsp; <span class='diff-add'> if (ch == 0) type = styles[2];</span>&nbsp; <span class='diff-add'> else for (;;) {</span>&nbsp; <span class='diff-add'> var mid = (before + after) >> 1;</span>&nbsp; <span class='diff-add'> if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;</span>&nbsp; <span class='diff-add'> else if (styles[mid * 2 + 1] < ch) before = mid + 1;</span>&nbsp; <span class='diff-add'> else { type = styles[mid * 2 + 2]; break; }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var cut = type ? type.indexOf("cm-overlay ") : -1;</span>&nbsp; <span class='diff-add'> return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getModeAt: function(pos) {</span>&nbsp; <span class='diff-add'> var mode = this.doc.mode;</span>&nbsp; <span class='diff-add'> if (!mode.innerMode) return mode;</span>&nbsp; <span class='diff-add'> return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getHelper: function(pos, type) {</span>&nbsp; <span class='diff-add'> return this.getHelpers(pos, type)[0];</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getHelpers: function(pos, type) {</span>&nbsp; <span class='diff-add'> var found = [];</span>&nbsp; <span class='diff-add'> if (!helpers.hasOwnProperty(type)) return helpers;</span>&nbsp; <span class='diff-add'> var help = helpers[type], mode = this.getModeAt(pos);</span>&nbsp; <span class='diff-add'> if (typeof mode[type] == "string") {</span>&nbsp; <span class='diff-add'> if (help[mode[type]]) found.push(help[mode[type]]);</span>&nbsp; <span class='diff-add'> } else if (mode[type]) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < mode[type].length; i++) {</span>&nbsp; <span class='diff-add'> var val = help[mode[type][i]];</span>&nbsp; <span class='diff-add'> if (val) found.push(val);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (mode.helperType && help[mode.helperType]) {</span>&nbsp; <span class='diff-add'> found.push(help[mode.helperType]);</span>&nbsp; <span class='diff-add'> } else if (help[mode.name]) {</span>&nbsp; <span class='diff-add'> found.push(help[mode.name]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (var i = 0; i < help._global.length; i++) {</span>&nbsp; <span class='diff-add'> var cur = help._global[i];</span>&nbsp; <span class='diff-add'> if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)</span>&nbsp; <span class='diff-add'> found.push(cur.val);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return found;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getStateAfter: function(line, precise) {</span>&nbsp; <span class='diff-add'> var doc = this.doc;</span>&nbsp; <span class='diff-add'> line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);</span>&nbsp; <span class='diff-add'> return getStateBefore(this, line + 1, precise);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> cursorCoords: function(start, mode) {</span>&nbsp; <span class='diff-add'> var pos, range = this.doc.sel.primary();</span>&nbsp; <span class='diff-add'> if (start == null) pos = range.head;</span>&nbsp; <span class='diff-add'> else if (typeof start == "object") pos = clipPos(this.doc, start);</span>&nbsp; <span class='diff-add'> else pos = start ? range.from() : range.to();</span>&nbsp; <span class='diff-add'> return cursorCoords(this, pos, mode || "page");</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> charCoords: function(pos, mode) {</span>&nbsp; <span class='diff-add'> return charCoords(this, clipPos(this.doc, pos), mode || "page");</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> coordsChar: function(coords, mode) {</span>&nbsp; <span class='diff-add'> coords = fromCoordSystem(this, coords, mode || "page");</span>&nbsp; <span class='diff-add'> return coordsChar(this, coords.left, coords.top);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> lineAtHeight: function(height, mode) {</span>&nbsp; <span class='diff-add'> height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;</span>&nbsp; <span class='diff-add'> return lineAtHeight(this.doc, height + this.display.viewOffset);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> heightAtLine: function(line, mode) {</span>&nbsp; <span class='diff-add'> var end = false, last = this.doc.first + this.doc.size - 1;</span>&nbsp; <span class='diff-add'> if (line < this.doc.first) line = this.doc.first;</span>&nbsp; <span class='diff-add'> else if (line > last) { line = last; end = true; }</span>&nbsp; <span class='diff-add'> var lineObj = getLine(this.doc, line);</span>&nbsp; <span class='diff-add'> return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page").top +</span>&nbsp; <span class='diff-add'> (end ? this.doc.height - heightAtLine(lineObj) : 0);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> defaultTextHeight: function() { return textHeight(this.display); },</span>&nbsp; <span class='diff-add'> defaultCharWidth: function() { return charWidth(this.display); },</span>&nbsp; <span class='diff-add'> setGutterMarker: methodOp(function(line, gutterID, value) {</span>&nbsp; <span class='diff-add'> return changeLine(this.doc, line, "gutter", function(line) {</span>&nbsp; <span class='diff-add'> var markers = line.gutterMarkers || (line.gutterMarkers = {});</span>&nbsp; <span class='diff-add'> markers[gutterID] = value;</span>&nbsp; <span class='diff-add'> if (!value && isEmpty(markers)) line.gutterMarkers = null;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> clearGutter: methodOp(function(gutterID) {</span>&nbsp; <span class='diff-add'> var cm = this, doc = cm.doc, i = doc.first;</span>&nbsp; <span class='diff-add'> doc.iter(function(line) {</span>&nbsp; <span class='diff-add'> if (line.gutterMarkers && line.gutterMarkers[gutterID]) {</span>&nbsp; <span class='diff-add'> line.gutterMarkers[gutterID] = null;</span>&nbsp; <span class='diff-add'> regLineChange(cm, i, "gutter");</span>&nbsp; <span class='diff-add'> if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ++i;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> addLineWidget: methodOp(function(handle, node, options) {</span>&nbsp; <span class='diff-add'> return addLineWidget(this, handle, node, options);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> removeLineWidget: function(widget) { widget.clear(); },</span>&nbsp; <span class='diff-add'> lineInfo: function(line) {</span>&nbsp; <span class='diff-add'> if (typeof line == "number") {</span>&nbsp; <span class='diff-add'> if (!isLine(this.doc, line)) return null;</span>&nbsp; <span class='diff-add'> var n = line;</span>&nbsp; <span class='diff-add'> line = getLine(this.doc, line);</span>&nbsp; <span class='diff-add'> if (!line) return null;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var n = lineNo(line);</span>&nbsp; <span class='diff-add'> if (n == null) return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,</span>&nbsp; <span class='diff-add'> textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,</span>&nbsp; <span class='diff-add'> widgets: line.widgets};</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};},</span>&nbsp; <span class='diff-add'> addWidget: function(pos, node, scroll, vert, horiz) {</span>&nbsp; <span class='diff-add'> var display = this.display;</span>&nbsp; <span class='diff-add'> pos = cursorCoords(this, clipPos(this.doc, pos));</span>&nbsp; <span class='diff-add'> var top = pos.bottom, left = pos.left;</span>&nbsp; <span class='diff-add'> node.style.position = "absolute";</span>&nbsp; <span class='diff-add'> node.setAttribute("cm-ignore-events", "true");</span>&nbsp; <span class='diff-add'> display.sizer.appendChild(node);</span>&nbsp; <span class='diff-add'> if (vert == "over") {</span>&nbsp; <span class='diff-add'> top = pos.top;</span>&nbsp; <span class='diff-add'> } else if (vert == "above" || vert == "near") {</span>&nbsp; <span class='diff-add'> var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),</span>&nbsp; <span class='diff-add'> hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);</span>&nbsp; <span class='diff-add'> // Default to positioning above (if specified and possible); otherwise default to positioning below</span>&nbsp; <span class='diff-add'> if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)</span>&nbsp; <span class='diff-add'> top = pos.top - node.offsetHeight;</span>&nbsp; <span class='diff-add'> else if (pos.bottom + node.offsetHeight <= vspace)</span>&nbsp; <span class='diff-add'> top = pos.bottom;</span>&nbsp; <span class='diff-add'> if (left + node.offsetWidth > hspace)</span>&nbsp; <span class='diff-add'> left = hspace - node.offsetWidth;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> node.style.top = top + "px";</span>&nbsp; <span class='diff-add'> node.style.left = node.style.right = "";</span>&nbsp; <span class='diff-add'> if (horiz == "right") {</span>&nbsp; <span class='diff-add'> left = display.sizer.clientWidth - node.offsetWidth;</span>&nbsp; <span class='diff-add'> node.style.right = "0px";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> if (horiz == "left") left = 0;</span>&nbsp; <span class='diff-add'> else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2;</span>&nbsp; <span class='diff-add'> node.style.left = left + "px";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (scroll)</span>&nbsp; <span class='diff-add'> scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> triggerOnKeyDown: methodOp(onKeyDown),</span>&nbsp; <span class='diff-add'> triggerOnKeyPress: methodOp(onKeyPress),</span>&nbsp; <span class='diff-add'> triggerOnKeyUp: onKeyUp,</span>&nbsp; <span class='diff-add'> execCommand: function(cmd) {</span>&nbsp; <span class='diff-add'> if (commands.hasOwnProperty(cmd))</span>&nbsp; <span class='diff-add'> return commands[cmd](this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> findPosH: function(from, amount, unit, visually) {</span>&nbsp; <span class='diff-add'> var dir = 1;</span>&nbsp; <span class='diff-add'> if (amount < 0) { dir = -1; amount = -amount; }</span>&nbsp; <span class='diff-add'> for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {</span>&nbsp; <span class='diff-add'> cur = findPosH(this.doc, cur, dir, unit, visually);</span>&nbsp; <span class='diff-add'> if (cur.hitSide) break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cur;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> moveH: methodOp(function(dir, unit) {</span>&nbsp; <span class='diff-add'> var cm = this;</span>&nbsp; <span class='diff-add'> cm.extendSelectionsBy(function(range) {</span>&nbsp; <span class='diff-add'> if (cm.display.shift || cm.doc.extend || range.empty())</span>&nbsp; <span class='diff-add'> return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> return dir < 0 ? range.from() : range.to();</span>&nbsp; <span class='diff-add'> }, sel_move);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> deleteH: methodOp(function(dir, unit) {</span>&nbsp; <span class='diff-add'> var sel = this.doc.sel, doc = this.doc;</span>&nbsp; <span class='diff-add'> if (sel.somethingSelected())</span>&nbsp; <span class='diff-add'> doc.replaceSelection("", null, "+delete");</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> deleteNearSelection(this, function(range) {</span>&nbsp; <span class='diff-add'> var other = findPosH(doc, range.head, dir, unit, false);</span>&nbsp; <span class='diff-add'> return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> findPosV: function(from, amount, unit, goalColumn) {</span>&nbsp; <span class='diff-add'> var dir = 1, x = goalColumn;</span>&nbsp; <span class='diff-add'> if (amount < 0) { dir = -1; amount = -amount; }</span>&nbsp; <span class='diff-add'> for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {</span>&nbsp; <span class='diff-add'> var coords = cursorCoords(this, cur, "div");</span>&nbsp; <span class='diff-add'> if (x == null) x = coords.left;</span>&nbsp; <span class='diff-add'> else coords.left = x;</span>&nbsp; <span class='diff-add'> cur = findPosV(this, coords, dir, unit);</span>&nbsp; <span class='diff-add'> if (cur.hitSide) break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cur;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> moveV: methodOp(function(dir, unit) {</span>&nbsp; <span class='diff-add'> var cm = this, doc = this.doc, goals = [];</span>&nbsp; <span class='diff-add'> var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();</span>&nbsp; <span class='diff-add'> doc.extendSelectionsBy(function(range) {</span>&nbsp; <span class='diff-add'> if (collapse)</span>&nbsp; <span class='diff-add'> return dir < 0 ? range.from() : range.to();</span>&nbsp; <span class='diff-add'> var headPos = cursorCoords(cm, range.head, "div");</span>&nbsp; <span class='diff-add'> if (range.goalColumn != null) headPos.left = range.goalColumn;</span>&nbsp; <span class='diff-add'> goals.push(headPos.left);</span>&nbsp; <span class='diff-add'> var pos = findPosV(cm, headPos, dir, unit);</span>&nbsp; <span class='diff-add'> if (unit == "page" && range == doc.sel.primary())</span>&nbsp; <span class='diff-add'> addToScrollPos(cm, null, charCoords(cm, pos, "div").top - headPos.top);</span>&nbsp; <span class='diff-add'> return pos;</span>&nbsp; <span class='diff-add'> }, sel_move);</span>&nbsp; <span class='diff-add'> if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++)</span>&nbsp; <span class='diff-add'> doc.sel.ranges[i].goalColumn = goals[i];</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> // Find the word at the given position (as returned by coordsChar).</span>&nbsp; <span class='diff-add'> findWordAt: function(pos) {</span>&nbsp; <span class='diff-add'> var doc = this.doc, line = getLine(doc, pos.line).text;</span>&nbsp; <span class='diff-add'> var start = pos.ch, end = pos.ch;</span>&nbsp; <span class='diff-add'> if (line) {</span>&nbsp; <span class='diff-add'> var helper = this.getHelper(pos, "wordChars");</span>&nbsp; <span class='diff-add'> if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;</span>&nbsp; <span class='diff-add'> var startChar = line.charAt(start);</span>&nbsp; <span class='diff-add'> var check = isWordChar(startChar, helper)</span>&nbsp; <span class='diff-add'> ? function(ch) { return isWordChar(ch, helper); }</span>&nbsp; <span class='diff-add'> : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}</span>&nbsp; <span class='diff-add'> : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};</span>&nbsp; <span class='diff-add'> while (start > 0 && check(line.charAt(start - 1))) --start;</span>&nbsp; <span class='diff-add'> while (end < line.length && check(line.charAt(end))) ++end;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return new Range(Pos(pos.line, start), Pos(pos.line, end));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> toggleOverwrite: function(value) {</span>&nbsp; <span class='diff-add'> if (value != null && value == this.state.overwrite) return;</span>&nbsp; <span class='diff-add'> if (this.state.overwrite = !this.state.overwrite)</span>&nbsp; <span class='diff-add'> addClass(this.display.cursorDiv, "CodeMirror-overwrite");</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> rmClass(this.display.cursorDiv, "CodeMirror-overwrite");</span>&nbsp; <span class='diff-add'> signal(this, "overwriteToggle", this, this.state.overwrite);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> hasFocus: function() { return activeElt() == this.display.input; },</span>&nbsp; <span class='diff-add'> scrollTo: methodOp(function(x, y) {</span>&nbsp; <span class='diff-add'> if (x != null || y != null) resolveScrollToPos(this);</span>&nbsp; <span class='diff-add'> if (x != null) this.curOp.scrollLeft = x;</span>&nbsp; <span class='diff-add'> if (y != null) this.curOp.scrollTop = y;</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> getScrollInfo: function() {</span>&nbsp; <span class='diff-add'> var scroller = this.display.scroller;</span>&nbsp; <span class='diff-add'> return {left: scroller.scrollLeft, top: scroller.scrollTop,</span>&nbsp; <span class='diff-add'> height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,</span>&nbsp; <span class='diff-add'> width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,</span>&nbsp; <span class='diff-add'> clientHeight: displayHeight(this), clientWidth: displayWidth(this)};</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> scrollIntoView: methodOp(function(range, margin) {</span>&nbsp; <span class='diff-add'> if (range == null) {</span>&nbsp; <span class='diff-add'> range = {from: this.doc.sel.primary().head, to: null};</span>&nbsp; <span class='diff-add'> if (margin == null) margin = this.options.cursorScrollMargin;</span>&nbsp; <span class='diff-add'> } else if (typeof range == "number") {</span>&nbsp; <span class='diff-add'> range = {from: Pos(range, 0), to: null};</span>&nbsp; <span class='diff-add'> } else if (range.from == null) {</span>&nbsp; <span class='diff-add'> range = {from: range, to: null};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!range.to) range.to = range.from;</span>&nbsp; <span class='diff-add'> range.margin = margin || 0;</span>&nbsp; <span class='diff-add'> if (range.from.line != null) {</span>&nbsp; <span class='diff-add'> resolveScrollToPos(this);</span>&nbsp; <span class='diff-add'> this.curOp.scrollToPos = range;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),</span>&nbsp; <span class='diff-add'> Math.min(range.from.top, range.to.top) - range.margin,</span>&nbsp; <span class='diff-add'> Math.max(range.from.right, range.to.right),</span>&nbsp; <span class='diff-add'> Math.max(range.from.bottom, range.to.bottom) + range.margin);</span>&nbsp; <span class='diff-add'> this.scrollTo(sPos.scrollLeft, sPos.scrollTop);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> setSize: methodOp(function(width, height) {</span>&nbsp; <span class='diff-add'> var cm = this;</span>&nbsp; <span class='diff-add'> function interpret(val) {</span>&nbsp; <span class='diff-add'> return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (width != null) cm.display.wrapper.style.width = interpret(width);</span>&nbsp; <span class='diff-add'> if (height != null) cm.display.wrapper.style.height = interpret(height);</span>&nbsp; <span class='diff-add'> if (cm.options.lineWrapping) clearLineMeasurementCache(this);</span>&nbsp; <span class='diff-add'> var lineNo = cm.display.viewFrom;</span>&nbsp; <span class='diff-add'> cm.doc.iter(lineNo, cm.display.viewTo, function(line) {</span>&nbsp; <span class='diff-add'> if (line.widgets) for (var i = 0; i < line.widgets.length; i++)</span>&nbsp; <span class='diff-add'> if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, "widget"); break; }</span>&nbsp; <span class='diff-add'> ++lineNo;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> cm.curOp.forceUpdate = true;</span>&nbsp; <span class='diff-add'> signal(cm, "refresh", this);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> operation: function(f){return runInOp(this, f);},</span>&nbsp; <span class='diff-add'> refresh: methodOp(function() {</span>&nbsp; <span class='diff-add'> var oldHeight = this.display.cachedTextHeight;</span>&nbsp; <span class='diff-add'> regChange(this);</span>&nbsp; <span class='diff-add'> this.curOp.forceUpdate = true;</span>&nbsp; <span class='diff-add'> clearCaches(this);</span>&nbsp; <span class='diff-add'> this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);</span>&nbsp; <span class='diff-add'> updateGutterSpace(this);</span>&nbsp; <span class='diff-add'> if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)</span>&nbsp; <span class='diff-add'> estimateLineHeights(this);</span>&nbsp; <span class='diff-add'> signal(this, "refresh", this);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> swapDoc: methodOp(function(doc) {</span>&nbsp; <span class='diff-add'> var old = this.doc;</span>&nbsp; <span class='diff-add'> old.cm = null;</span>&nbsp; <span class='diff-add'> attachDoc(this, doc);</span>&nbsp; <span class='diff-add'> clearCaches(this);</span>&nbsp; <span class='diff-add'> resetInput(this);</span>&nbsp; <span class='diff-add'> this.scrollTo(doc.scrollLeft, doc.scrollTop);</span>&nbsp; <span class='diff-add'> this.curOp.forceScroll = true;</span>&nbsp; <span class='diff-add'> signalLater(this, "swapDoc", this, old);</span>&nbsp; <span class='diff-add'> return old;</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> getInputField: function(){return this.display.input;},</span>&nbsp; <span class='diff-add'> getWrapperElement: function(){return this.display.wrapper;},</span>&nbsp; <span class='diff-add'> getScrollerElement: function(){return this.display.scroller;},</span>&nbsp; <span class='diff-add'> getGutterElement: function(){return this.display.gutters;}</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> eventMixin(CodeMirror);</span>&nbsp; <span class='diff-add'> // OPTION DEFAULTS</span>&nbsp; <span class='diff-add'> // The default configuration options.</span>&nbsp; <span class='diff-add'> var defaults = CodeMirror.defaults = {};</span>&nbsp; <span class='diff-add'> // Functions to run when options are changed.</span>&nbsp; <span class='diff-add'> var optionHandlers = CodeMirror.optionHandlers = {};</span>&nbsp; <span class='diff-add'> function option(name, deflt, handle, notOnInit) {</span>&nbsp; <span class='diff-add'> CodeMirror.defaults[name] = deflt;</span>&nbsp; <span class='diff-add'> if (handle) optionHandlers[name] =</span>&nbsp; <span class='diff-add'> notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Passed to option handlers when there is no old value.</span>&nbsp; <span class='diff-add'> var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}};</span>&nbsp; <span class='diff-add'> // These two are, on init, called from the constructor because they</span>&nbsp; <span class='diff-add'> // have to be initialized before the editor can start at all.</span>&nbsp; <span class='diff-add'> option("value", "", function(cm, val) {</span>&nbsp; <span class='diff-add'> cm.setValue(val);</span>&nbsp; <span class='diff-add'> }, true);</span>&nbsp; <span class='diff-add'> option("mode", null, function(cm, val) {</span>&nbsp; <span class='diff-add'> cm.doc.modeOption = val;</span>&nbsp; <span class='diff-add'> loadMode(cm);</span>&nbsp; <span class='diff-add'> }, true);</span>&nbsp; <span class='diff-add'> option("indentUnit", 2, loadMode, true);</span>&nbsp; <span class='diff-add'> option("indentWithTabs", false);</span>&nbsp; <span class='diff-add'> option("smartIndent", true);</span>&nbsp; <span class='diff-add'> option("tabSize", 4, function(cm) {</span>&nbsp; <span class='diff-add'> resetModeState(cm);</span>&nbsp; <span class='diff-add'> clearCaches(cm);</span>&nbsp; <span class='diff-add'> regChange(cm);</span>&nbsp; <span class='diff-add'> }, true);</span>&nbsp; <span class='diff-add'> option("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val) {</span>&nbsp; <span class='diff-add'> cm.options.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");</span>&nbsp; <span class='diff-add'> cm.refresh();</span>&nbsp; <span class='diff-add'> }, true);</span>&nbsp; <span class='diff-add'> option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);</span>&nbsp; <span class='diff-add'> option("electricChars", true);</span>&nbsp; <span class='diff-add'> option("rtlMoveVisually", !windows);</span>&nbsp; <span class='diff-add'> option("wholeLineUpdateBefore", true);</span>&nbsp; <span class='diff-add'> option("theme", "default", function(cm) {</span>&nbsp; <span class='diff-add'> themeChanged(cm);</span>&nbsp; <span class='diff-add'> guttersChanged(cm);</span>&nbsp; <span class='diff-add'> }, true);</span>&nbsp; <span class='diff-add'> option("keyMap", "default", function(cm, val, old) {</span>&nbsp; <span class='diff-add'> var next = getKeyMap(val);</span>&nbsp; <span class='diff-add'> var prev = old != CodeMirror.Init && getKeyMap(old);</span>&nbsp; <span class='diff-add'> if (prev && prev.detach) prev.detach(cm, next);</span>&nbsp; <span class='diff-add'> if (next.attach) next.attach(cm, prev || null);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> option("extraKeys", null);</span>&nbsp; <span class='diff-add'> option("lineWrapping", false, wrappingChanged, true);</span>&nbsp; <span class='diff-add'> option("gutters", [], function(cm) {</span>&nbsp; <span class='diff-add'> setGuttersForLineNumbers(cm.options);</span>&nbsp; <span class='diff-add'> guttersChanged(cm);</span>&nbsp; <span class='diff-add'> }, true);</span>&nbsp; <span class='diff-add'> option("fixedGutter", true, function(cm, val) {</span>&nbsp; <span class='diff-add'> cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";</span>&nbsp; <span class='diff-add'> cm.refresh();</span>&nbsp; <span class='diff-add'> }, true);</span>&nbsp; <span class='diff-add'> option("coverGutterNextToScrollbar", false, function(cm) {updateScrollbars(cm);}, true);</span>&nbsp; <span class='diff-add'> option("scrollbarStyle", "native", function(cm) {</span>&nbsp; <span class='diff-add'> initScrollbars(cm);</span>&nbsp; <span class='diff-add'> updateScrollbars(cm);</span>&nbsp; <span class='diff-add'> cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);</span>&nbsp; <span class='diff-add'> cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);</span>&nbsp; <span class='diff-add'> }, true);</span>&nbsp; <span class='diff-add'> option("lineNumbers", false, function(cm) {</span>&nbsp; <span class='diff-add'> setGuttersForLineNumbers(cm.options);</span>&nbsp; <span class='diff-add'> guttersChanged(cm);</span>&nbsp; <span class='diff-add'> }, true);</span>&nbsp; <span class='diff-add'> option("firstLineNumber", 1, guttersChanged, true);</span>&nbsp; <span class='diff-add'> option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true);</span>&nbsp; <span class='diff-add'> option("showCursorWhenSelecting", false, updateSelection, true);</span>&nbsp; <span class='diff-add'> option("resetSelectionOnContextMenu", true);</span>&nbsp; <span class='diff-add'> option("readOnly", false, function(cm, val) {</span>&nbsp; <span class='diff-add'> if (val == "nocursor") {</span>&nbsp; <span class='diff-add'> onBlur(cm);</span>&nbsp; <span class='diff-add'> cm.display.input.blur();</span>&nbsp; <span class='diff-add'> cm.display.disabled = true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> cm.display.disabled = false;</span>&nbsp; <span class='diff-add'> if (!val) resetInput(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> option("disableInput", false, function(cm, val) {if (!val) resetInput(cm);}, true);</span>&nbsp; <span class='diff-add'> option("dragDrop", true);</span>&nbsp; <span class='diff-add'> option("cursorBlinkRate", 530);</span>&nbsp; <span class='diff-add'> option("cursorScrollMargin", 0);</span>&nbsp; <span class='diff-add'> option("cursorHeight", 1, updateSelection, true);</span>&nbsp; <span class='diff-add'> option("singleCursorHeightPerLine", true, updateSelection, true);</span>&nbsp; <span class='diff-add'> option("workTime", 100);</span>&nbsp; <span class='diff-add'> option("workDelay", 100);</span>&nbsp; <span class='diff-add'> option("flattenSpans", true, resetModeState, true);</span>&nbsp; <span class='diff-add'> option("addModeClass", false, resetModeState, true);</span>&nbsp; <span class='diff-add'> option("pollInterval", 100);</span>&nbsp; <span class='diff-add'> option("undoDepth", 200, function(cm, val){cm.doc.history.undoDepth = val;});</span>&nbsp; <span class='diff-add'> option("historyEventDelay", 1250);</span>&nbsp; <span class='diff-add'> option("viewportMargin", 10, function(cm){cm.refresh();}, true);</span>&nbsp; <span class='diff-add'> option("maxHighlightLength", 10000, resetModeState, true);</span>&nbsp; <span class='diff-add'> option("moveInputWithCursor", true, function(cm, val) {</span>&nbsp; <span class='diff-add'> if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> option("tabindex", null, function(cm, val) {</span>&nbsp; <span class='diff-add'> cm.display.input.tabIndex = val || "";</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> option("autofocus", null);</span>&nbsp; <span class='diff-add'> // MODE DEFINITION AND QUERYING</span>&nbsp; <span class='diff-add'> // Known modes, by name and by MIME</span>&nbsp; <span class='diff-add'> var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};</span>&nbsp; <span class='diff-add'> // Extra arguments are stored as the mode's dependencies, which is</span>&nbsp; <span class='diff-add'> // used by (legacy) mechanisms like loadmode.js to automatically</span>&nbsp; <span class='diff-add'> // load a mode. (Preferred mechanism is the require/define calls.)</span>&nbsp; <span class='diff-add'> CodeMirror.defineMode = function(name, mode) {</span>&nbsp; <span class='diff-add'> if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;</span>&nbsp; <span class='diff-add'> if (arguments.length > 2)</span>&nbsp; <span class='diff-add'> mode.dependencies = Array.prototype.slice.call(arguments, 2);</span>&nbsp; <span class='diff-add'> modes[name] = mode;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeMirror.defineMIME = function(mime, spec) {</span>&nbsp; <span class='diff-add'> mimeModes[mime] = spec;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Given a MIME type, a {name, ...options} config object, or a name</span>&nbsp; <span class='diff-add'> // string, return a mode config object.</span>&nbsp; <span class='diff-add'> CodeMirror.resolveMode = function(spec) {</span>&nbsp; <span class='diff-add'> if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {</span>&nbsp; <span class='diff-add'> spec = mimeModes[spec];</span>&nbsp; <span class='diff-add'> } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {</span>&nbsp; <span class='diff-add'> var found = mimeModes[spec.name];</span>&nbsp; <span class='diff-add'> if (typeof found == "string") found = {name: found};</span>&nbsp; <span class='diff-add'> spec = createObj(found, spec);</span>&nbsp; <span class='diff-add'> spec.name = found.name;</span>&nbsp; <span class='diff-add'> } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {</span>&nbsp; <span class='diff-add'> return CodeMirror.resolveMode("application/xml");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof spec == "string") return {name: spec};</span>&nbsp; <span class='diff-add'> else return spec || {name: "null"};</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Given a mode spec (anything that resolveMode accepts), find and</span>&nbsp; <span class='diff-add'> // initialize an actual mode object.</span>&nbsp; <span class='diff-add'> CodeMirror.getMode = function(options, spec) {</span>&nbsp; <span class='diff-add'> var spec = CodeMirror.resolveMode(spec);</span>&nbsp; <span class='diff-add'> var mfactory = modes[spec.name];</span>&nbsp; <span class='diff-add'> if (!mfactory) return CodeMirror.getMode(options, "text/plain");</span>&nbsp; <span class='diff-add'> var modeObj = mfactory(options, spec);</span>&nbsp; <span class='diff-add'> if (modeExtensions.hasOwnProperty(spec.name)) {</span>&nbsp; <span class='diff-add'> var exts = modeExtensions[spec.name];</span>&nbsp; <span class='diff-add'> for (var prop in exts) {</span>&nbsp; <span class='diff-add'> if (!exts.hasOwnProperty(prop)) continue;</span>&nbsp; <span class='diff-add'> if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop];</span>&nbsp; <span class='diff-add'> modeObj[prop] = exts[prop];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> modeObj.name = spec.name;</span>&nbsp; <span class='diff-add'> if (spec.helperType) modeObj.helperType = spec.helperType;</span>&nbsp; <span class='diff-add'> if (spec.modeProps) for (var prop in spec.modeProps)</span>&nbsp; <span class='diff-add'> modeObj[prop] = spec.modeProps[prop];</span>&nbsp; <span class='diff-add'> return modeObj;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Minimal default mode.</span>&nbsp; <span class='diff-add'> CodeMirror.defineMode("null", function() {</span>&nbsp; <span class='diff-add'> return {token: function(stream) {stream.skipToEnd();}};</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> CodeMirror.defineMIME("text/plain", "null");</span>&nbsp; <span class='diff-add'> // This can be used to attach properties to mode objects from</span>&nbsp; <span class='diff-add'> // outside the actual mode definition.</span>&nbsp; <span class='diff-add'> var modeExtensions = CodeMirror.modeExtensions = {};</span>&nbsp; <span class='diff-add'> CodeMirror.extendMode = function(mode, properties) {</span>&nbsp; <span class='diff-add'> var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});</span>&nbsp; <span class='diff-add'> copyObj(properties, exts);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // EXTENSIONS</span>&nbsp; <span class='diff-add'> CodeMirror.defineExtension = function(name, func) {</span>&nbsp; <span class='diff-add'> CodeMirror.prototype[name] = func;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeMirror.defineDocExtension = function(name, func) {</span>&nbsp; <span class='diff-add'> Doc.prototype[name] = func;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeMirror.defineOption = option;</span>&nbsp; <span class='diff-add'> var initHooks = [];</span>&nbsp; <span class='diff-add'> CodeMirror.defineInitHook = function(f) {initHooks.push(f);};</span>&nbsp; <span class='diff-add'> var helpers = CodeMirror.helpers = {};</span>&nbsp; <span class='diff-add'> CodeMirror.registerHelper = function(type, name, value) {</span>&nbsp; <span class='diff-add'> if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};</span>&nbsp; <span class='diff-add'> helpers[type][name] = value;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {</span>&nbsp; <span class='diff-add'> CodeMirror.registerHelper(type, name, value);</span>&nbsp; <span class='diff-add'> helpers[type]._global.push({pred: predicate, val: value});</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // MODE STATE HANDLING</span>&nbsp; <span class='diff-add'> // Utility functions for working with state. Exported because nested</span>&nbsp; <span class='diff-add'> // modes need to do this for their inner modes.</span>&nbsp; <span class='diff-add'> var copyState = CodeMirror.copyState = function(mode, state) {</span>&nbsp; <span class='diff-add'> if (state === true) return state;</span>&nbsp; <span class='diff-add'> if (mode.copyState) return mode.copyState(state);</span>&nbsp; <span class='diff-add'> var nstate = {};</span>&nbsp; <span class='diff-add'> for (var n in state) {</span>&nbsp; <span class='diff-add'> var val = state[n];</span>&nbsp; <span class='diff-add'> if (val instanceof Array) val = val.concat([]);</span>&nbsp; <span class='diff-add'> nstate[n] = val;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return nstate;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var startState = CodeMirror.startState = function(mode, a1, a2) {</span>&nbsp; <span class='diff-add'> return mode.startState ? mode.startState(a1, a2) : true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Given a mode and a state (for that mode), find the inner mode and</span>&nbsp; <span class='diff-add'> // state at the position that the state refers to.</span>&nbsp; <span class='diff-add'> CodeMirror.innerMode = function(mode, state) {</span>&nbsp; <span class='diff-add'> while (mode.innerMode) {</span>&nbsp; <span class='diff-add'> var info = mode.innerMode(state);</span>&nbsp; <span class='diff-add'> if (!info || info.mode == mode) break;</span>&nbsp; <span class='diff-add'> state = info.state;</span>&nbsp; <span class='diff-add'> mode = info.mode;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return info || {mode: mode, state: state};</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // STANDARD COMMANDS</span>&nbsp; <span class='diff-add'> // Commands are parameter-less actions that can be performed on an</span>&nbsp; <span class='diff-add'> // editor, mostly used for keybindings.</span>&nbsp; <span class='diff-add'> var commands = CodeMirror.commands = {</span>&nbsp; <span class='diff-add'> selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},</span>&nbsp; <span class='diff-add'> singleSelection: function(cm) {</span>&nbsp; <span class='diff-add'> cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> killLine: function(cm) {</span>&nbsp; <span class='diff-add'> deleteNearSelection(cm, function(range) {</span>&nbsp; <span class='diff-add'> if (range.empty()) {</span>&nbsp; <span class='diff-add'> var len = getLine(cm.doc, range.head.line).text.length;</span>&nbsp; <span class='diff-add'> if (range.head.ch == len && range.head.line < cm.lastLine())</span>&nbsp; <span class='diff-add'> return {from: range.head, to: Pos(range.head.line + 1, 0)};</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> return {from: range.head, to: Pos(range.head.line, len)};</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return {from: range.from(), to: range.to()};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> deleteLine: function(cm) {</span>&nbsp; <span class='diff-add'> deleteNearSelection(cm, function(range) {</span>&nbsp; <span class='diff-add'> return {from: Pos(range.from().line, 0),</span>&nbsp; <span class='diff-add'> to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> delLineLeft: function(cm) {</span>&nbsp; <span class='diff-add'> deleteNearSelection(cm, function(range) {</span>&nbsp; <span class='diff-add'> return {from: Pos(range.from().line, 0), to: range.from()};</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> delWrappedLineLeft: function(cm) {</span>&nbsp; <span class='diff-add'> deleteNearSelection(cm, function(range) {</span>&nbsp; <span class='diff-add'> var top = cm.charCoords(range.head, "div").top + 5;</span>&nbsp; <span class='diff-add'> var leftPos = cm.coordsChar({left: 0, top: top}, "div");</span>&nbsp; <span class='diff-add'> return {from: leftPos, to: range.from()};</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> delWrappedLineRight: function(cm) {</span>&nbsp; <span class='diff-add'> deleteNearSelection(cm, function(range) {</span>&nbsp; <span class='diff-add'> var top = cm.charCoords(range.head, "div").top + 5;</span>&nbsp; <span class='diff-add'> var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");</span>&nbsp; <span class='diff-add'> return {from: range.from(), to: rightPos };</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> undo: function(cm) {cm.undo();},</span>&nbsp; <span class='diff-add'> redo: function(cm) {cm.redo();},</span>&nbsp; <span class='diff-add'> undoSelection: function(cm) {cm.undoSelection();},</span>&nbsp; <span class='diff-add'> redoSelection: function(cm) {cm.redoSelection();},</span>&nbsp; <span class='diff-add'> goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},</span>&nbsp; <span class='diff-add'> goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},</span>&nbsp; <span class='diff-add'> goLineStart: function(cm) {</span>&nbsp; <span class='diff-add'> cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); },</span>&nbsp; <span class='diff-add'> {origin: "+move", bias: 1});</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> goLineStartSmart: function(cm) {</span>&nbsp; <span class='diff-add'> cm.extendSelectionsBy(function(range) {</span>&nbsp; <span class='diff-add'> return lineStartSmart(cm, range.head);</span>&nbsp; <span class='diff-add'> }, {origin: "+move", bias: 1});</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> goLineEnd: function(cm) {</span>&nbsp; <span class='diff-add'> cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); },</span>&nbsp; <span class='diff-add'> {origin: "+move", bias: -1});</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> goLineRight: function(cm) {</span>&nbsp; <span class='diff-add'> cm.extendSelectionsBy(function(range) {</span>&nbsp; <span class='diff-add'> var top = cm.charCoords(range.head, "div").top + 5;</span>&nbsp; <span class='diff-add'> return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");</span>&nbsp; <span class='diff-add'> }, sel_move);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> goLineLeft: function(cm) {</span>&nbsp; <span class='diff-add'> cm.extendSelectionsBy(function(range) {</span>&nbsp; <span class='diff-add'> var top = cm.charCoords(range.head, "div").top + 5;</span>&nbsp; <span class='diff-add'> return cm.coordsChar({left: 0, top: top}, "div");</span>&nbsp; <span class='diff-add'> }, sel_move);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> goLineLeftSmart: function(cm) {</span>&nbsp; <span class='diff-add'> cm.extendSelectionsBy(function(range) {</span>&nbsp; <span class='diff-add'> var top = cm.charCoords(range.head, "div").top + 5;</span>&nbsp; <span class='diff-add'> var pos = cm.coordsChar({left: 0, top: top}, "div");</span>&nbsp; <span class='diff-add'> if (pos.ch < cm.getLine(pos.line).search(/\S/)) return lineStartSmart(cm, range.head);</span>&nbsp; <span class='diff-add'> return pos;</span>&nbsp; <span class='diff-add'> }, sel_move);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> goLineUp: function(cm) {cm.moveV(-1, "line");},</span>&nbsp; <span class='diff-add'> goLineDown: function(cm) {cm.moveV(1, "line");},</span>&nbsp; <span class='diff-add'> goPageUp: function(cm) {cm.moveV(-1, "page");},</span>&nbsp; <span class='diff-add'> goPageDown: function(cm) {cm.moveV(1, "page");},</span>&nbsp; <span class='diff-add'> goCharLeft: function(cm) {cm.moveH(-1, "char");},</span>&nbsp; <span class='diff-add'> goCharRight: function(cm) {cm.moveH(1, "char");},</span>&nbsp; <span class='diff-add'> goColumnLeft: function(cm) {cm.moveH(-1, "column");},</span>&nbsp; <span class='diff-add'> goColumnRight: function(cm) {cm.moveH(1, "column");},</span>&nbsp; <span class='diff-add'> goWordLeft: function(cm) {cm.moveH(-1, "word");},</span>&nbsp; <span class='diff-add'> goGroupRight: function(cm) {cm.moveH(1, "group");},</span>&nbsp; <span class='diff-add'> goGroupLeft: function(cm) {cm.moveH(-1, "group");},</span>&nbsp; <span class='diff-add'> goWordRight: function(cm) {cm.moveH(1, "word");},</span>&nbsp; <span class='diff-add'> delCharBefore: function(cm) {cm.deleteH(-1, "char");},</span>&nbsp; <span class='diff-add'> delCharAfter: function(cm) {cm.deleteH(1, "char");},</span>&nbsp; <span class='diff-add'> delWordBefore: function(cm) {cm.deleteH(-1, "word");},</span>&nbsp; <span class='diff-add'> delWordAfter: function(cm) {cm.deleteH(1, "word");},</span>&nbsp; <span class='diff-add'> delGroupBefore: function(cm) {cm.deleteH(-1, "group");},</span>&nbsp; <span class='diff-add'> delGroupAfter: function(cm) {cm.deleteH(1, "group");},</span>&nbsp; <span class='diff-add'> indentAuto: function(cm) {cm.indentSelection("smart");},</span>&nbsp; <span class='diff-add'> indentMore: function(cm) {cm.indentSelection("add");},</span>&nbsp; <span class='diff-add'> indentLess: function(cm) {cm.indentSelection("subtract");},</span>&nbsp; <span class='diff-add'> insertTab: function(cm) {cm.replaceSelection("\t");},</span>&nbsp; <span class='diff-add'> insertSoftTab: function(cm) {</span>&nbsp; <span class='diff-add'> var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var pos = ranges[i].from();</span>&nbsp; <span class='diff-add'> var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);</span>&nbsp; <span class='diff-add'> spaces.push(new Array(tabSize - col % tabSize + 1).join(" "));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.replaceSelections(spaces);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> defaultTab: function(cm) {</span>&nbsp; <span class='diff-add'> if (cm.somethingSelected()) cm.indentSelection("add");</span>&nbsp; <span class='diff-add'> else cm.execCommand("insertTab");</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> transposeChars: function(cm) {</span>&nbsp; <span class='diff-add'> runInOp(cm, function() {</span>&nbsp; <span class='diff-add'> var ranges = cm.listSelections(), newSel = [];</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;</span>&nbsp; <span class='diff-add'> if (line) {</span>&nbsp; <span class='diff-add'> if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1);</span>&nbsp; <span class='diff-add'> if (cur.ch > 0) {</span>&nbsp; <span class='diff-add'> cur = new Pos(cur.line, cur.ch + 1);</span>&nbsp; <span class='diff-add'> cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),</span>&nbsp; <span class='diff-add'> Pos(cur.line, cur.ch - 2), cur, "+transpose");</span>&nbsp; <span class='diff-add'> } else if (cur.line > cm.doc.first) {</span>&nbsp; <span class='diff-add'> var prev = getLine(cm.doc, cur.line - 1).text;</span>&nbsp; <span class='diff-add'> if (prev)</span>&nbsp; <span class='diff-add'> cm.replaceRange(line.charAt(0) + "\n" + prev.charAt(prev.length - 1),</span>&nbsp; <span class='diff-add'> Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), "+transpose");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> newSel.push(new Range(cur, cur));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.setSelections(newSel);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> newlineAndIndent: function(cm) {</span>&nbsp; <span class='diff-add'> runInOp(cm, function() {</span>&nbsp; <span class='diff-add'> var len = cm.listSelections().length;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < len; i++) {</span>&nbsp; <span class='diff-add'> var range = cm.listSelections()[i];</span>&nbsp; <span class='diff-add'> cm.replaceRange("\n", range.anchor, range.head, "+input");</span>&nbsp; <span class='diff-add'> cm.indentLine(range.from().line + 1, null, true);</span>&nbsp; <span class='diff-add'> ensureCursorVisible(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> toggleOverwrite: function(cm) {cm.toggleOverwrite();}</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // STANDARD KEYMAPS</span>&nbsp; <span class='diff-add'> var keyMap = CodeMirror.keyMap = {};</span>&nbsp; <span class='diff-add'> keyMap.basic = {</span>&nbsp; <span class='diff-add'> "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",</span>&nbsp; <span class='diff-add'> "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",</span>&nbsp; <span class='diff-add'> "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",</span>&nbsp; <span class='diff-add'> "Tab": "defaultTab", "Shift-Tab": "indentAuto",</span>&nbsp; <span class='diff-add'> "Enter": "newlineAndIndent", "Insert": "toggleOverwrite",</span>&nbsp; <span class='diff-add'> "Esc": "singleSelection"</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Note that the save and find-related commands aren't defined by</span>&nbsp; <span class='diff-add'> // default. User code or addons can define them. Unknown commands</span>&nbsp; <span class='diff-add'> // are simply ignored.</span>&nbsp; <span class='diff-add'> keyMap.pcDefault = {</span>&nbsp; <span class='diff-add'> "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",</span>&nbsp; <span class='diff-add'> "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",</span>&nbsp; <span class='diff-add'> "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",</span>&nbsp; <span class='diff-add'> "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",</span>&nbsp; <span class='diff-add'> "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",</span>&nbsp; <span class='diff-add'> "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",</span>&nbsp; <span class='diff-add'> "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection",</span>&nbsp; <span class='diff-add'> fallthrough: "basic"</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Very basic readline/emacs-style bindings, which are standard on Mac.</span>&nbsp; <span class='diff-add'> keyMap.emacsy = {</span>&nbsp; <span class='diff-add'> "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",</span>&nbsp; <span class='diff-add'> "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",</span>&nbsp; <span class='diff-add'> "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",</span>&nbsp; <span class='diff-add'> "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> keyMap.macDefault = {</span>&nbsp; <span class='diff-add'> "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",</span>&nbsp; <span class='diff-add'> "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",</span>&nbsp; <span class='diff-add'> "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore",</span>&nbsp; <span class='diff-add'> "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",</span>&nbsp; <span class='diff-add'> "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",</span>&nbsp; <span class='diff-add'> "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",</span>&nbsp; <span class='diff-add'> "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",</span>&nbsp; <span class='diff-add'> fallthrough: ["basic", "emacsy"]</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;</span>&nbsp; <span class='diff-add'> // KEYMAP DISPATCH</span>&nbsp; <span class='diff-add'> function normalizeKeyName(name) {</span>&nbsp; <span class='diff-add'> var parts = name.split(/-(?!$)/), name = parts[parts.length - 1];</span>&nbsp; <span class='diff-add'> var alt, ctrl, shift, cmd;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < parts.length - 1; i++) {</span>&nbsp; <span class='diff-add'> var mod = parts[i];</span>&nbsp; <span class='diff-add'> if (/^(cmd|meta|m)$/i.test(mod)) cmd = true;</span>&nbsp; <span class='diff-add'> else if (/^a(lt)?$/i.test(mod)) alt = true;</span>&nbsp; <span class='diff-add'> else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;</span>&nbsp; <span class='diff-add'> else if (/^s(hift)$/i.test(mod)) shift = true;</span>&nbsp; <span class='diff-add'> else throw new Error("Unrecognized modifier name: " + mod);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (alt) name = "Alt-" + name;</span>&nbsp; <span class='diff-add'> if (ctrl) name = "Ctrl-" + name;</span>&nbsp; <span class='diff-add'> if (cmd) name = "Cmd-" + name;</span>&nbsp; <span class='diff-add'> if (shift) name = "Shift-" + name;</span>&nbsp; <span class='diff-add'> return name;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // This is a kludge to keep keymaps mostly working as raw objects</span>&nbsp; <span class='diff-add'> // (backwards compatibility) while at the same time support features</span>&nbsp; <span class='diff-add'> // like normalization and multi-stroke key bindings. It compiles a</span>&nbsp; <span class='diff-add'> // new normalized keymap, and then updates the old object to reflect</span>&nbsp; <span class='diff-add'> // this.</span>&nbsp; <span class='diff-add'> CodeMirror.normalizeKeyMap = function(keymap) {</span>&nbsp; <span class='diff-add'> var copy = {};</span>&nbsp; <span class='diff-add'> for (var keyname in keymap) if (keymap.hasOwnProperty(keyname)) {</span>&nbsp; <span class='diff-add'> var value = keymap[keyname];</span>&nbsp; <span class='diff-add'> if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) continue;</span>&nbsp; <span class='diff-add'> if (value == "...") { delete keymap[keyname]; continue; }</span>&nbsp; <span class='diff-add'> var keys = map(keyname.split(" "), normalizeKeyName);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < keys.length; i++) {</span>&nbsp; <span class='diff-add'> var val, name;</span>&nbsp; <span class='diff-add'> if (i == keys.length - 1) {</span>&nbsp; <span class='diff-add'> name = keyname;</span>&nbsp; <span class='diff-add'> val = value;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> name = keys.slice(0, i + 1).join(" ");</span>&nbsp; <span class='diff-add'> val = "...";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var prev = copy[name];</span>&nbsp; <span class='diff-add'> if (!prev) copy[name] = val;</span>&nbsp; <span class='diff-add'> else if (prev != val) throw new Error("Inconsistent bindings for " + name);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> delete keymap[keyname];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (var prop in copy) keymap[prop] = copy[prop];</span>&nbsp; <span class='diff-add'> return keymap;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var lookupKey = CodeMirror.lookupKey = function(key, map, handle, context) {</span>&nbsp; <span class='diff-add'> map = getKeyMap(map);</span>&nbsp; <span class='diff-add'> var found = map.call ? map.call(key, context) : map[key];</span>&nbsp; <span class='diff-add'> if (found === false) return "nothing";</span>&nbsp; <span class='diff-add'> if (found === "...") return "multi";</span>&nbsp; <span class='diff-add'> if (found != null && handle(found)) return "handled";</span>&nbsp; <span class='diff-add'> if (map.fallthrough) {</span>&nbsp; <span class='diff-add'> if (Object.prototype.toString.call(map.fallthrough) != "[object Array]")</span>&nbsp; <span class='diff-add'> return lookupKey(key, map.fallthrough, handle, context);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < map.fallthrough.length; i++) {</span>&nbsp; <span class='diff-add'> var result = lookupKey(key, map.fallthrough[i], handle, context);</span>&nbsp; <span class='diff-add'> if (result) return result;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Modifier key presses don't count as 'real' key presses for the</span>&nbsp; <span class='diff-add'> // purpose of keymap fallthrough.</span>&nbsp; <span class='diff-add'> var isModifierKey = CodeMirror.isModifierKey = function(value) {</span>&nbsp; <span class='diff-add'> var name = typeof value == "string" ? value : keyNames[value.keyCode];</span>&nbsp; <span class='diff-add'> return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Look up the name of a key as indicated by an event object.</span>&nbsp; <span class='diff-add'> var keyName = CodeMirror.keyName = function(event, noShift) {</span>&nbsp; <span class='diff-add'> if (presto && event.keyCode == 34 && event["char"]) return false;</span>&nbsp; <span class='diff-add'> var base = keyNames[event.keyCode], name = base;</span>&nbsp; <span class='diff-add'> if (name == null || event.altGraphKey) return false;</span>&nbsp; <span class='diff-add'> if (event.altKey && base != "Alt") name = "Alt-" + name;</span>&nbsp; <span class='diff-add'> if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") name = "Ctrl-" + name;</span>&nbsp; <span class='diff-add'> if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") name = "Cmd-" + name;</span>&nbsp; <span class='diff-add'> if (!noShift && event.shiftKey && base != "Shift") name = "Shift-" + name;</span>&nbsp; <span class='diff-add'> return name;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function getKeyMap(val) {</span>&nbsp; <span class='diff-add'> return typeof val == "string" ? keyMap[val] : val;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // FROMTEXTAREA</span>&nbsp; <span class='diff-add'> CodeMirror.fromTextArea = function(textarea, options) {</span>&nbsp; <span class='diff-add'> if (!options) options = {};</span>&nbsp; <span class='diff-add'> options.value = textarea.value;</span>&nbsp; <span class='diff-add'> if (!options.tabindex && textarea.tabindex)</span>&nbsp; <span class='diff-add'> options.tabindex = textarea.tabindex;</span>&nbsp; <span class='diff-add'> if (!options.placeholder && textarea.placeholder)</span>&nbsp; <span class='diff-add'> options.placeholder = textarea.placeholder;</span>&nbsp; <span class='diff-add'> // Set autofocus to true if this textarea is focused, or if it has</span>&nbsp; <span class='diff-add'> // autofocus and no other element is focused.</span>&nbsp; <span class='diff-add'> if (options.autofocus == null) {</span>&nbsp; <span class='diff-add'> var hasFocus = activeElt();</span>&nbsp; <span class='diff-add'> options.autofocus = hasFocus == textarea ||</span>&nbsp; <span class='diff-add'> textarea.getAttribute("autofocus") != null && hasFocus == document.body;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function save() {textarea.value = cm.getValue();}</span>&nbsp; <span class='diff-add'> if (textarea.form) {</span>&nbsp; <span class='diff-add'> on(textarea.form, "submit", save);</span>&nbsp; <span class='diff-add'> // Deplorable hack to make the submit method do the right thing.</span>&nbsp; <span class='diff-add'> if (!options.leaveSubmitMethodAlone) {</span>&nbsp; <span class='diff-add'> var form = textarea.form, realSubmit = form.submit;</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> var wrappedSubmit = form.submit = function() {</span>&nbsp; <span class='diff-add'> save();</span>&nbsp; <span class='diff-add'> form.submit = realSubmit;</span>&nbsp; <span class='diff-add'> form.submit();</span>&nbsp; <span class='diff-add'> form.submit = wrappedSubmit;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> } catch(e) {}</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> textarea.style.display = "none";</span>&nbsp; <span class='diff-add'> var cm = CodeMirror(function(node) {</span>&nbsp; <span class='diff-add'> textarea.parentNode.insertBefore(node, textarea.nextSibling);</span>&nbsp; <span class='diff-add'> }, options);</span>&nbsp; <span class='diff-add'> cm.save = save;</span>&nbsp; <span class='diff-add'> cm.getTextArea = function() { return textarea; };</span>&nbsp; <span class='diff-add'> cm.toTextArea = function() {</span>&nbsp; <span class='diff-add'> cm.toTextArea = isNaN; // Prevent this from being ran twice</span>&nbsp; <span class='diff-add'> save();</span>&nbsp; <span class='diff-add'> textarea.parentNode.removeChild(cm.getWrapperElement());</span>&nbsp; <span class='diff-add'> textarea.style.display = "";</span>&nbsp; <span class='diff-add'> if (textarea.form) {</span>&nbsp; <span class='diff-add'> off(textarea.form, "submit", save);</span>&nbsp; <span class='diff-add'> if (typeof textarea.form.submit == "function")</span>&nbsp; <span class='diff-add'> textarea.form.submit = realSubmit;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return cm;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // STRING STREAM</span>&nbsp; <span class='diff-add'> // Fed to the mode parsers, provides helper functions to make</span>&nbsp; <span class='diff-add'> // parsers more succinct.</span>&nbsp; <span class='diff-add'> var StringStream = CodeMirror.StringStream = function(string, tabSize) {</span>&nbsp; <span class='diff-add'> this.pos = this.start = 0;</span>&nbsp; <span class='diff-add'> this.string = string;</span>&nbsp; <span class='diff-add'> this.tabSize = tabSize || 8;</span>&nbsp; <span class='diff-add'> this.lastColumnPos = this.lastColumnValue = 0;</span>&nbsp; <span class='diff-add'> this.lineStart = 0;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> StringStream.prototype = {</span>&nbsp; <span class='diff-add'> eol: function() {return this.pos >= this.string.length;},</span>&nbsp; <span class='diff-add'> sol: function() {return this.pos == this.lineStart;},</span>&nbsp; <span class='diff-add'> peek: function() {return this.string.charAt(this.pos) || undefined;},</span>&nbsp; <span class='diff-add'> next: function() {</span>&nbsp; <span class='diff-add'> if (this.pos < this.string.length)</span>&nbsp; <span class='diff-add'> return this.string.charAt(this.pos++);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> eat: function(match) {</span>&nbsp; <span class='diff-add'> var ch = this.string.charAt(this.pos);</span>&nbsp; <span class='diff-add'> if (typeof match == "string") var ok = ch == match;</span>&nbsp; <span class='diff-add'> else var ok = ch && (match.test ? match.test(ch) : match(ch));</span>&nbsp; <span class='diff-add'> if (ok) {++this.pos; return ch;}</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> eatWhile: function(match) {</span>&nbsp; <span class='diff-add'> var start = this.pos;</span>&nbsp; <span class='diff-add'> while (this.eat(match)){}</span>&nbsp; <span class='diff-add'> return this.pos > start;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> eatSpace: function() {</span>&nbsp; <span class='diff-add'> var start = this.pos;</span>&nbsp; <span class='diff-add'> while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;</span>&nbsp; <span class='diff-add'> return this.pos > start;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> skipToEnd: function() {this.pos = this.string.length;},</span>&nbsp; <span class='diff-add'> skipTo: function(ch) {</span>&nbsp; <span class='diff-add'> var found = this.string.indexOf(ch, this.pos);</span>&nbsp; <span class='diff-add'> if (found > -1) {this.pos = found; return true;}</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> backUp: function(n) {this.pos -= n;},</span>&nbsp; <span class='diff-add'> column: function() {</span>&nbsp; <span class='diff-add'> if (this.lastColumnPos < this.start) {</span>&nbsp; <span class='diff-add'> this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);</span>&nbsp; <span class='diff-add'> this.lastColumnPos = this.start;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> indentation: function() {</span>&nbsp; <span class='diff-add'> return countColumn(this.string, null, this.tabSize) -</span>&nbsp; <span class='diff-add'> (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> match: function(pattern, consume, caseInsensitive) {</span>&nbsp; <span class='diff-add'> if (typeof pattern == "string") {</span>&nbsp; <span class='diff-add'> var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};</span>&nbsp; <span class='diff-add'> var substr = this.string.substr(this.pos, pattern.length);</span>&nbsp; <span class='diff-add'> if (cased(substr) == cased(pattern)) {</span>&nbsp; <span class='diff-add'> if (consume !== false) this.pos += pattern.length;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var match = this.string.slice(this.pos).match(pattern);</span>&nbsp; <span class='diff-add'> if (match && match.index > 0) return null;</span>&nbsp; <span class='diff-add'> if (match && consume !== false) this.pos += match[0].length;</span>&nbsp; <span class='diff-add'> return match;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> current: function(){return this.string.slice(this.start, this.pos);},</span>&nbsp; <span class='diff-add'> hideFirstChars: function(n, inner) {</span>&nbsp; <span class='diff-add'> this.lineStart += n;</span>&nbsp; <span class='diff-add'> try { return inner(); }</span>&nbsp; <span class='diff-add'> finally { this.lineStart -= n; }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // TEXTMARKERS</span>&nbsp; <span class='diff-add'> // Created with markText and setBookmark methods. A TextMarker is a</span>&nbsp; <span class='diff-add'> // handle that can be used to clear or find a marked position in the</span>&nbsp; <span class='diff-add'> // document. Line objects hold arrays (markedSpans) containing</span>&nbsp; <span class='diff-add'> // {from, to, marker} object pointing to such marker objects, and</span>&nbsp; <span class='diff-add'> // indicating that such a marker is present on that line. Multiple</span>&nbsp; <span class='diff-add'> // lines may point to the same marker when it spans across lines.</span>&nbsp; <span class='diff-add'> // The spans will have null for their from/to properties when the</span>&nbsp; <span class='diff-add'> // marker continues beyond the start/end of the line. Markers have</span>&nbsp; <span class='diff-add'> // links back to the lines they currently touch.</span>&nbsp; <span class='diff-add'> var TextMarker = CodeMirror.TextMarker = function(doc, type) {</span>&nbsp; <span class='diff-add'> this.lines = [];</span>&nbsp; <span class='diff-add'> this.type = type;</span>&nbsp; <span class='diff-add'> this.doc = doc;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> eventMixin(TextMarker);</span>&nbsp; <span class='diff-add'> // Clear the marker.</span>&nbsp; <span class='diff-add'> TextMarker.prototype.clear = function() {</span>&nbsp; <span class='diff-add'> if (this.explicitlyCleared) return;</span>&nbsp; <span class='diff-add'> var cm = this.doc.cm, withOp = cm && !cm.curOp;</span>&nbsp; <span class='diff-add'> if (withOp) startOperation(cm);</span>&nbsp; <span class='diff-add'> if (hasHandler(this, "clear")) {</span>&nbsp; <span class='diff-add'> var found = this.find();</span>&nbsp; <span class='diff-add'> if (found) signalLater(this, "clear", found.from, found.to);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var min = null, max = null;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.lines.length; ++i) {</span>&nbsp; <span class='diff-add'> var line = this.lines[i];</span>&nbsp; <span class='diff-add'> var span = getMarkedSpanFor(line.markedSpans, this);</span>&nbsp; <span class='diff-add'> if (cm && !this.collapsed) regLineChange(cm, lineNo(line), "text");</span>&nbsp; <span class='diff-add'> else if (cm) {</span>&nbsp; <span class='diff-add'> if (span.to != null) max = lineNo(line);</span>&nbsp; <span class='diff-add'> if (span.from != null) min = lineNo(line);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> line.markedSpans = removeMarkedSpan(line.markedSpans, span);</span>&nbsp; <span class='diff-add'> if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)</span>&nbsp; <span class='diff-add'> updateLineHeight(line, textHeight(cm.display));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {</span>&nbsp; <span class='diff-add'> var visual = visualLine(this.lines[i]), len = lineLength(visual);</span>&nbsp; <span class='diff-add'> if (len > cm.display.maxLineLength) {</span>&nbsp; <span class='diff-add'> cm.display.maxLine = visual;</span>&nbsp; <span class='diff-add'> cm.display.maxLineLength = len;</span>&nbsp; <span class='diff-add'> cm.display.maxLineChanged = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (min != null && cm && this.collapsed) regChange(cm, min, max + 1);</span>&nbsp; <span class='diff-add'> this.lines.length = 0;</span>&nbsp; <span class='diff-add'> this.explicitlyCleared = true;</span>&nbsp; <span class='diff-add'> if (this.atomic && this.doc.cantEdit) {</span>&nbsp; <span class='diff-add'> this.doc.cantEdit = false;</span>&nbsp; <span class='diff-add'> if (cm) reCheckSelection(cm.doc);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (cm) signalLater(cm, "markerCleared", cm, this);</span>&nbsp; <span class='diff-add'> if (withOp) endOperation(cm);</span>&nbsp; <span class='diff-add'> if (this.parent) this.parent.clear();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Find the position of the marker in the document. Returns a {from,</span>&nbsp; <span class='diff-add'> // to} object by default. Side can be passed to get a specific side</span>&nbsp; <span class='diff-add'> // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the</span>&nbsp; <span class='diff-add'> // Pos objects returned contain a line object, rather than a line</span>&nbsp; <span class='diff-add'> // number (used to prevent looking up the same line twice).</span>&nbsp; <span class='diff-add'> TextMarker.prototype.find = function(side, lineObj) {</span>&nbsp; <span class='diff-add'> if (side == null && this.type == "bookmark") side = 1;</span>&nbsp; <span class='diff-add'> var from, to;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.lines.length; ++i) {</span>&nbsp; <span class='diff-add'> var line = this.lines[i];</span>&nbsp; <span class='diff-add'> var span = getMarkedSpanFor(line.markedSpans, this);</span>&nbsp; <span class='diff-add'> if (span.from != null) {</span>&nbsp; <span class='diff-add'> from = Pos(lineObj ? line : lineNo(line), span.from);</span>&nbsp; <span class='diff-add'> if (side == -1) return from;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (span.to != null) {</span>&nbsp; <span class='diff-add'> to = Pos(lineObj ? line : lineNo(line), span.to);</span>&nbsp; <span class='diff-add'> if (side == 1) return to;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return from && {from: from, to: to};</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Signals that the marker's widget changed, and surrounding layout</span>&nbsp; <span class='diff-add'> // should be recomputed.</span>&nbsp; <span class='diff-add'> TextMarker.prototype.changed = function() {</span>&nbsp; <span class='diff-add'> var pos = this.find(-1, true), widget = this, cm = this.doc.cm;</span>&nbsp; <span class='diff-add'> if (!pos || !cm) return;</span>&nbsp; <span class='diff-add'> runInOp(cm, function() {</span>&nbsp; <span class='diff-add'> var line = pos.line, lineN = lineNo(pos.line);</span>&nbsp; <span class='diff-add'> var view = findViewForLine(cm, lineN);</span>&nbsp; <span class='diff-add'> if (view) {</span>&nbsp; <span class='diff-add'> clearLineMeasurementCacheFor(view);</span>&nbsp; <span class='diff-add'> cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cm.curOp.updateMaxLine = true;</span>&nbsp; <span class='diff-add'> if (!lineIsHidden(widget.doc, line) && widget.height != null) {</span>&nbsp; <span class='diff-add'> var oldHeight = widget.height;</span>&nbsp; <span class='diff-add'> widget.height = null;</span>&nbsp; <span class='diff-add'> var dHeight = widgetHeight(widget) - oldHeight;</span>&nbsp; <span class='diff-add'> if (dHeight)</span>&nbsp; <span class='diff-add'> updateLineHeight(line, line.height + dHeight);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> TextMarker.prototype.attachLine = function(line) {</span>&nbsp; <span class='diff-add'> if (!this.lines.length && this.doc.cm) {</span>&nbsp; <span class='diff-add'> var op = this.doc.cm.curOp;</span>&nbsp; <span class='diff-add'> if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)</span>&nbsp; <span class='diff-add'> (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.lines.push(line);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> TextMarker.prototype.detachLine = function(line) {</span>&nbsp; <span class='diff-add'> this.lines.splice(indexOf(this.lines, line), 1);</span>&nbsp; <span class='diff-add'> if (!this.lines.length && this.doc.cm) {</span>&nbsp; <span class='diff-add'> var op = this.doc.cm.curOp;</span>&nbsp; <span class='diff-add'> (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Collapsed markers have unique ids, in order to be able to order</span>&nbsp; <span class='diff-add'> // them, which is needed for uniquely determining an outer marker</span>&nbsp; <span class='diff-add'> // when they overlap (they may nest, but not partially overlap).</span>&nbsp; <span class='diff-add'> var nextMarkerId = 0;</span>&nbsp; <span class='diff-add'> // Create a marker, wire it up to the right lines, and</span>&nbsp; <span class='diff-add'> function markText(doc, from, to, options, type) {</span>&nbsp; <span class='diff-add'> // Shared markers (across linked documents) are handled separately</span>&nbsp; <span class='diff-add'> // (markTextShared will call out to this again, once per</span>&nbsp; <span class='diff-add'> // document).</span>&nbsp; <span class='diff-add'> if (options && options.shared) return markTextShared(doc, from, to, options, type);</span>&nbsp; <span class='diff-add'> // Ensure we are in an operation.</span>&nbsp; <span class='diff-add'> if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);</span>&nbsp; <span class='diff-add'> var marker = new TextMarker(doc, type), diff = cmp(from, to);</span>&nbsp; <span class='diff-add'> if (options) copyObj(options, marker, false);</span>&nbsp; <span class='diff-add'> // Don't connect empty markers unless clearWhenEmpty is false</span>&nbsp; <span class='diff-add'> if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)</span>&nbsp; <span class='diff-add'> return marker;</span>&nbsp; <span class='diff-add'> if (marker.replacedWith) {</span>&nbsp; <span class='diff-add'> // Showing up as a widget implies collapsed (widget replaces text)</span>&nbsp; <span class='diff-add'> marker.collapsed = true;</span>&nbsp; <span class='diff-add'> marker.widgetNode = elt("span", [marker.replacedWith], "CodeMirror-widget");</span>&nbsp; <span class='diff-add'> if (!options.handleMouseEvents) marker.widgetNode.setAttribute("cm-ignore-events", "true");</span>&nbsp; <span class='diff-add'> if (options.insertLeft) marker.widgetNode.insertLeft = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (marker.collapsed) {</span>&nbsp; <span class='diff-add'> if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||</span>&nbsp; <span class='diff-add'> from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))</span>&nbsp; <span class='diff-add'> throw new Error("Inserting collapsed marker partially overlapping an existing one");</span>&nbsp; <span class='diff-add'> sawCollapsedSpans = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (marker.addToHistory)</span>&nbsp; <span class='diff-add'> addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN);</span>&nbsp; <span class='diff-add'> var curLine = from.line, cm = doc.cm, updateMaxLine;</span>&nbsp; <span class='diff-add'> doc.iter(curLine, to.line + 1, function(line) {</span>&nbsp; <span class='diff-add'> if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)</span>&nbsp; <span class='diff-add'> updateMaxLine = true;</span>&nbsp; <span class='diff-add'> if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);</span>&nbsp; <span class='diff-add'> addMarkedSpan(line, new MarkedSpan(marker,</span>&nbsp; <span class='diff-add'> curLine == from.line ? from.ch : null,</span>&nbsp; <span class='diff-add'> curLine == to.line ? to.ch : null));</span>&nbsp; <span class='diff-add'> ++curLine;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // lineIsHidden depends on the presence of the spans, so needs a second pass</span>&nbsp; <span class='diff-add'> if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {</span>&nbsp; <span class='diff-add'> if (lineIsHidden(doc, line)) updateLineHeight(line, 0);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); });</span>&nbsp; <span class='diff-add'> if (marker.readOnly) {</span>&nbsp; <span class='diff-add'> sawReadOnlySpans = true;</span>&nbsp; <span class='diff-add'> if (doc.history.done.length || doc.history.undone.length)</span>&nbsp; <span class='diff-add'> doc.clearHistory();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (marker.collapsed) {</span>&nbsp; <span class='diff-add'> marker.id = ++nextMarkerId;</span>&nbsp; <span class='diff-add'> marker.atomic = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (cm) {</span>&nbsp; <span class='diff-add'> // Sync editor state</span>&nbsp; <span class='diff-add'> if (updateMaxLine) cm.curOp.updateMaxLine = true;</span>&nbsp; <span class='diff-add'> if (marker.collapsed)</span>&nbsp; <span class='diff-add'> regChange(cm, from.line, to.line + 1);</span>&nbsp; <span class='diff-add'> else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)</span>&nbsp; <span class='diff-add'> for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, "text");</span>&nbsp; <span class='diff-add'> if (marker.atomic) reCheckSelection(cm.doc);</span>&nbsp; <span class='diff-add'> signalLater(cm, "markerAdded", cm, marker);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return marker;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // SHARED TEXTMARKERS</span>&nbsp; <span class='diff-add'> // A shared marker spans multiple linked documents. It is</span>&nbsp; <span class='diff-add'> // implemented as a meta-marker-object controlling multiple normal</span>&nbsp; <span class='diff-add'> // markers.</span>&nbsp; <span class='diff-add'> var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {</span>&nbsp; <span class='diff-add'> this.markers = markers;</span>&nbsp; <span class='diff-add'> this.primary = primary;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < markers.length; ++i)</span>&nbsp; <span class='diff-add'> markers[i].parent = this;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> eventMixin(SharedTextMarker);</span>&nbsp; <span class='diff-add'> SharedTextMarker.prototype.clear = function() {</span>&nbsp; <span class='diff-add'> if (this.explicitlyCleared) return;</span>&nbsp; <span class='diff-add'> this.explicitlyCleared = true;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.markers.length; ++i)</span>&nbsp; <span class='diff-add'> this.markers[i].clear();</span>&nbsp; <span class='diff-add'> signalLater(this, "clear");</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> SharedTextMarker.prototype.find = function(side, lineObj) {</span>&nbsp; <span class='diff-add'> return this.primary.find(side, lineObj);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function markTextShared(doc, from, to, options, type) {</span>&nbsp; <span class='diff-add'> options = copyObj(options);</span>&nbsp; <span class='diff-add'> options.shared = false;</span>&nbsp; <span class='diff-add'> var markers = [markText(doc, from, to, options, type)], primary = markers[0];</span>&nbsp; <span class='diff-add'> var widget = options.widgetNode;</span>&nbsp; <span class='diff-add'> linkedDocs(doc, function(doc) {</span>&nbsp; <span class='diff-add'> if (widget) options.widgetNode = widget.cloneNode(true);</span>&nbsp; <span class='diff-add'> markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));</span>&nbsp; <span class='diff-add'> for (var i = 0; i < doc.linked.length; ++i)</span>&nbsp; <span class='diff-add'> if (doc.linked[i].isParent) return;</span>&nbsp; <span class='diff-add'> primary = lst(markers);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return new SharedTextMarker(markers, primary);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function findSharedMarkers(doc) {</span>&nbsp; <span class='diff-add'> return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),</span>&nbsp; <span class='diff-add'> function(m) { return m.parent; });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function copySharedMarkers(doc, markers) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < markers.length; i++) {</span>&nbsp; <span class='diff-add'> var marker = markers[i], pos = marker.find();</span>&nbsp; <span class='diff-add'> var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);</span>&nbsp; <span class='diff-add'> if (cmp(mFrom, mTo)) {</span>&nbsp; <span class='diff-add'> var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);</span>&nbsp; <span class='diff-add'> marker.markers.push(subMark);</span>&nbsp; <span class='diff-add'> subMark.parent = marker;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function detachSharedMarkers(markers) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < markers.length; i++) {</span>&nbsp; <span class='diff-add'> var marker = markers[i], linked = [marker.primary.doc];;</span>&nbsp; <span class='diff-add'> linkedDocs(marker.primary.doc, function(d) { linked.push(d); });</span>&nbsp; <span class='diff-add'> for (var j = 0; j < marker.markers.length; j++) {</span>&nbsp; <span class='diff-add'> var subMarker = marker.markers[j];</span>&nbsp; <span class='diff-add'> if (indexOf(linked, subMarker.doc) == -1) {</span>&nbsp; <span class='diff-add'> subMarker.parent = null;</span>&nbsp; <span class='diff-add'> marker.markers.splice(j--, 1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // TEXTMARKER SPANS</span>&nbsp; <span class='diff-add'> function MarkedSpan(marker, from, to) {</span>&nbsp; <span class='diff-add'> this.marker = marker;</span>&nbsp; <span class='diff-add'> this.from = from; this.to = to;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Search an array of spans for a span matching the given marker.</span>&nbsp; <span class='diff-add'> function getMarkedSpanFor(spans, marker) {</span>&nbsp; <span class='diff-add'> if (spans) for (var i = 0; i < spans.length; ++i) {</span>&nbsp; <span class='diff-add'> var span = spans[i];</span>&nbsp; <span class='diff-add'> if (span.marker == marker) return span;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Remove a span from an array, returning undefined if no spans are</span>&nbsp; <span class='diff-add'> // left (we don't store arrays for lines without spans).</span>&nbsp; <span class='diff-add'> function removeMarkedSpan(spans, span) {</span>&nbsp; <span class='diff-add'> for (var r, i = 0; i < spans.length; ++i)</span>&nbsp; <span class='diff-add'> if (spans[i] != span) (r || (r = [])).push(spans[i]);</span>&nbsp; <span class='diff-add'> return r;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Add a span to a line.</span>&nbsp; <span class='diff-add'> function addMarkedSpan(line, span) {</span>&nbsp; <span class='diff-add'> line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];</span>&nbsp; <span class='diff-add'> span.marker.attachLine(line);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Used for the algorithm that adjusts markers for a change in the</span>&nbsp; <span class='diff-add'> // document. These functions cut an array of spans at a given</span>&nbsp; <span class='diff-add'> // character position, returning an array of remaining chunks (or</span>&nbsp; <span class='diff-add'> // undefined if nothing remains).</span>&nbsp; <span class='diff-add'> function markedSpansBefore(old, startCh, isInsert) {</span>&nbsp; <span class='diff-add'> if (old) for (var i = 0, nw; i < old.length; ++i) {</span>&nbsp; <span class='diff-add'> var span = old[i], marker = span.marker;</span>&nbsp; <span class='diff-add'> var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);</span>&nbsp; <span class='diff-add'> if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {</span>&nbsp; <span class='diff-add'> var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);</span>&nbsp; <span class='diff-add'> (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return nw;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function markedSpansAfter(old, endCh, isInsert) {</span>&nbsp; <span class='diff-add'> if (old) for (var i = 0, nw; i < old.length; ++i) {</span>&nbsp; <span class='diff-add'> var span = old[i], marker = span.marker;</span>&nbsp; <span class='diff-add'> var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);</span>&nbsp; <span class='diff-add'> if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {</span>&nbsp; <span class='diff-add'> var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);</span>&nbsp; <span class='diff-add'> (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,</span>&nbsp; <span class='diff-add'> span.to == null ? null : span.to - endCh));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return nw;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Given a change object, compute the new set of marker spans that</span>&nbsp; <span class='diff-add'> // cover the line in which the change took place. Removes spans</span>&nbsp; <span class='diff-add'> // entirely within the change, reconnects spans belonging to the</span>&nbsp; <span class='diff-add'> // same marker that appear on both sides of the change, and cuts off</span>&nbsp; <span class='diff-add'> // spans partially within the change. Returns an array of span</span>&nbsp; <span class='diff-add'> // arrays with one element for each line in (after) the change.</span>&nbsp; <span class='diff-add'> function stretchSpansOverChange(doc, change) {</span>&nbsp; <span class='diff-add'> var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;</span>&nbsp; <span class='diff-add'> var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;</span>&nbsp; <span class='diff-add'> if (!oldFirst && !oldLast) return null;</span>&nbsp; <span class='diff-add'> var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;</span>&nbsp; <span class='diff-add'> // Get the spans that 'stick out' on both sides</span>&nbsp; <span class='diff-add'> var first = markedSpansBefore(oldFirst, startCh, isInsert);</span>&nbsp; <span class='diff-add'> var last = markedSpansAfter(oldLast, endCh, isInsert);</span>&nbsp; <span class='diff-add'> // Next, merge those two ends</span>&nbsp; <span class='diff-add'> var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);</span>&nbsp; <span class='diff-add'> if (first) {</span>&nbsp; <span class='diff-add'> // Fix up .to properties of first</span>&nbsp; <span class='diff-add'> for (var i = 0; i < first.length; ++i) {</span>&nbsp; <span class='diff-add'> var span = first[i];</span>&nbsp; <span class='diff-add'> if (span.to == null) {</span>&nbsp; <span class='diff-add'> var found = getMarkedSpanFor(last, span.marker);</span>&nbsp; <span class='diff-add'> if (!found) span.to = startCh;</span>&nbsp; <span class='diff-add'> else if (sameLine) span.to = found.to == null ? null : found.to + offset;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (last) {</span>&nbsp; <span class='diff-add'> // Fix up .from in last (or move them into first in case of sameLine)</span>&nbsp; <span class='diff-add'> for (var i = 0; i < last.length; ++i) {</span>&nbsp; <span class='diff-add'> var span = last[i];</span>&nbsp; <span class='diff-add'> if (span.to != null) span.to += offset;</span>&nbsp; <span class='diff-add'> if (span.from == null) {</span>&nbsp; <span class='diff-add'> var found = getMarkedSpanFor(first, span.marker);</span>&nbsp; <span class='diff-add'> if (!found) {</span>&nbsp; <span class='diff-add'> span.from = offset;</span>&nbsp; <span class='diff-add'> if (sameLine) (first || (first = [])).push(span);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> span.from += offset;</span>&nbsp; <span class='diff-add'> if (sameLine) (first || (first = [])).push(span);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Make sure we didn't create any zero-length spans</span>&nbsp; <span class='diff-add'> if (first) first = clearEmptySpans(first);</span>&nbsp; <span class='diff-add'> if (last && last != first) last = clearEmptySpans(last);</span>&nbsp; <span class='diff-add'> var newMarkers = [first];</span>&nbsp; <span class='diff-add'> if (!sameLine) {</span>&nbsp; <span class='diff-add'> // Fill gap with whole-line-spans</span>&nbsp; <span class='diff-add'> var gap = change.text.length - 2, gapMarkers;</span>&nbsp; <span class='diff-add'> if (gap > 0 && first)</span>&nbsp; <span class='diff-add'> for (var i = 0; i < first.length; ++i)</span>&nbsp; <span class='diff-add'> if (first[i].to == null)</span>&nbsp; <span class='diff-add'> (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));</span>&nbsp; <span class='diff-add'> for (var i = 0; i < gap; ++i)</span>&nbsp; <span class='diff-add'> newMarkers.push(gapMarkers);</span>&nbsp; <span class='diff-add'> newMarkers.push(last);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return newMarkers;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Remove spans that are empty and don't have a clearWhenEmpty</span>&nbsp; <span class='diff-add'> // option of false.</span>&nbsp; <span class='diff-add'> function clearEmptySpans(spans) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < spans.length; ++i) {</span>&nbsp; <span class='diff-add'> var span = spans[i];</span>&nbsp; <span class='diff-add'> if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)</span>&nbsp; <span class='diff-add'> spans.splice(i--, 1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!spans.length) return null;</span>&nbsp; <span class='diff-add'> return spans;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Used for un/re-doing changes from the history. Combines the</span>&nbsp; <span class='diff-add'> // result of computing the existing spans with the set of spans that</span>&nbsp; <span class='diff-add'> // existed in the history (so that deleting around a span and then</span>&nbsp; <span class='diff-add'> // undoing brings back the span).</span>&nbsp; <span class='diff-add'> function mergeOldSpans(doc, change) {</span>&nbsp; <span class='diff-add'> var old = getOldSpans(doc, change);</span>&nbsp; <span class='diff-add'> var stretched = stretchSpansOverChange(doc, change);</span>&nbsp; <span class='diff-add'> if (!old) return stretched;</span>&nbsp; <span class='diff-add'> if (!stretched) return old;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < old.length; ++i) {</span>&nbsp; <span class='diff-add'> var oldCur = old[i], stretchCur = stretched[i];</span>&nbsp; <span class='diff-add'> if (oldCur && stretchCur) {</span>&nbsp; <span class='diff-add'> spans: for (var j = 0; j < stretchCur.length; ++j) {</span>&nbsp; <span class='diff-add'> var span = stretchCur[j];</span>&nbsp; <span class='diff-add'> for (var k = 0; k < oldCur.length; ++k)</span>&nbsp; <span class='diff-add'> if (oldCur[k].marker == span.marker) continue spans;</span>&nbsp; <span class='diff-add'> oldCur.push(span);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (stretchCur) {</span>&nbsp; <span class='diff-add'> old[i] = stretchCur;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return old;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Used to 'clip' out readOnly ranges when making a change.</span>&nbsp; <span class='diff-add'> function removeReadOnlyRanges(doc, from, to) {</span>&nbsp; <span class='diff-add'> var markers = null;</span>&nbsp; <span class='diff-add'> doc.iter(from.line, to.line + 1, function(line) {</span>&nbsp; <span class='diff-add'> if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {</span>&nbsp; <span class='diff-add'> var mark = line.markedSpans[i].marker;</span>&nbsp; <span class='diff-add'> if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))</span>&nbsp; <span class='diff-add'> (markers || (markers = [])).push(mark);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (!markers) return null;</span>&nbsp; <span class='diff-add'> var parts = [{from: from, to: to}];</span>&nbsp; <span class='diff-add'> for (var i = 0; i < markers.length; ++i) {</span>&nbsp; <span class='diff-add'> var mk = markers[i], m = mk.find(0);</span>&nbsp; <span class='diff-add'> for (var j = 0; j < parts.length; ++j) {</span>&nbsp; <span class='diff-add'> var p = parts[j];</span>&nbsp; <span class='diff-add'> if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue;</span>&nbsp; <span class='diff-add'> var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);</span>&nbsp; <span class='diff-add'> if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)</span>&nbsp; <span class='diff-add'> newParts.push({from: p.from, to: m.from});</span>&nbsp; <span class='diff-add'> if (dto > 0 || !mk.inclusiveRight && !dto)</span>&nbsp; <span class='diff-add'> newParts.push({from: m.to, to: p.to});</span>&nbsp; <span class='diff-add'> parts.splice.apply(parts, newParts);</span>&nbsp; <span class='diff-add'> j += newParts.length - 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return parts;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Connect or disconnect spans from a line.</span>&nbsp; <span class='diff-add'> function detachMarkedSpans(line) {</span>&nbsp; <span class='diff-add'> var spans = line.markedSpans;</span>&nbsp; <span class='diff-add'> if (!spans) return;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < spans.length; ++i)</span>&nbsp; <span class='diff-add'> spans[i].marker.detachLine(line);</span>&nbsp; <span class='diff-add'> line.markedSpans = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function attachMarkedSpans(line, spans) {</span>&nbsp; <span class='diff-add'> if (!spans) return;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < spans.length; ++i)</span>&nbsp; <span class='diff-add'> spans[i].marker.attachLine(line);</span>&nbsp; <span class='diff-add'> line.markedSpans = spans;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Helpers used when computing which overlapping collapsed span</span>&nbsp; <span class='diff-add'> // counts as the larger one.</span>&nbsp; <span class='diff-add'> function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }</span>&nbsp; <span class='diff-add'> function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }</span>&nbsp; <span class='diff-add'> // Returns a number indicating which of two overlapping collapsed</span>&nbsp; <span class='diff-add'> // spans is larger (and thus includes the other). Falls back to</span>&nbsp; <span class='diff-add'> // comparing ids when the spans cover exactly the same range.</span>&nbsp; <span class='diff-add'> function compareCollapsedMarkers(a, b) {</span>&nbsp; <span class='diff-add'> var lenDiff = a.lines.length - b.lines.length;</span>&nbsp; <span class='diff-add'> if (lenDiff != 0) return lenDiff;</span>&nbsp; <span class='diff-add'> var aPos = a.find(), bPos = b.find();</span>&nbsp; <span class='diff-add'> var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);</span>&nbsp; <span class='diff-add'> if (fromCmp) return -fromCmp;</span>&nbsp; <span class='diff-add'> var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);</span>&nbsp; <span class='diff-add'> if (toCmp) return toCmp;</span>&nbsp; <span class='diff-add'> return b.id - a.id;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Find out whether a line ends or starts in a collapsed span. If</span>&nbsp; <span class='diff-add'> // so, return the marker for that span.</span>&nbsp; <span class='diff-add'> function collapsedSpanAtSide(line, start) {</span>&nbsp; <span class='diff-add'> var sps = sawCollapsedSpans && line.markedSpans, found;</span>&nbsp; <span class='diff-add'> if (sps) for (var sp, i = 0; i < sps.length; ++i) {</span>&nbsp; <span class='diff-add'> sp = sps[i];</span>&nbsp; <span class='diff-add'> if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&</span>&nbsp; <span class='diff-add'> (!found || compareCollapsedMarkers(found, sp.marker) < 0))</span>&nbsp; <span class='diff-add'> found = sp.marker;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return found;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }</span>&nbsp; <span class='diff-add'> function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }</span>&nbsp; <span class='diff-add'> // Test whether there exists a collapsed span that partially</span>&nbsp; <span class='diff-add'> // overlaps (covers the start or end, but not both) of a new span.</span>&nbsp; <span class='diff-add'> // Such overlap is not allowed.</span>&nbsp; <span class='diff-add'> function conflictingCollapsedRange(doc, lineNo, from, to, marker) {</span>&nbsp; <span class='diff-add'> var line = getLine(doc, lineNo);</span>&nbsp; <span class='diff-add'> var sps = sawCollapsedSpans && line.markedSpans;</span>&nbsp; <span class='diff-add'> if (sps) for (var i = 0; i < sps.length; ++i) {</span>&nbsp; <span class='diff-add'> var sp = sps[i];</span>&nbsp; <span class='diff-add'> if (!sp.marker.collapsed) continue;</span>&nbsp; <span class='diff-add'> var found = sp.marker.find(0);</span>&nbsp; <span class='diff-add'> var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);</span>&nbsp; <span class='diff-add'> var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);</span>&nbsp; <span class='diff-add'> if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;</span>&nbsp; <span class='diff-add'> if (fromCmp <= 0 && (cmp(found.to, from) > 0 || (sp.marker.inclusiveRight && marker.inclusiveLeft)) ||</span>&nbsp; <span class='diff-add'> fromCmp >= 0 && (cmp(found.from, to) < 0 || (sp.marker.inclusiveLeft && marker.inclusiveRight)))</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // A visual line is a line as drawn on the screen. Folding, for</span>&nbsp; <span class='diff-add'> // example, can cause multiple logical lines to appear on the same</span>&nbsp; <span class='diff-add'> // visual line. This finds the start of the visual line that the</span>&nbsp; <span class='diff-add'> // given line is part of (usually that is the line itself).</span>&nbsp; <span class='diff-add'> function visualLine(line) {</span>&nbsp; <span class='diff-add'> var merged;</span>&nbsp; <span class='diff-add'> while (merged = collapsedSpanAtStart(line))</span>&nbsp; <span class='diff-add'> line = merged.find(-1, true).line;</span>&nbsp; <span class='diff-add'> return line;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Returns an array of logical lines that continue the visual line</span>&nbsp; <span class='diff-add'> // started by the argument, or undefined if there are no such lines.</span>&nbsp; <span class='diff-add'> function visualLineContinued(line) {</span>&nbsp; <span class='diff-add'> var merged, lines;</span>&nbsp; <span class='diff-add'> while (merged = collapsedSpanAtEnd(line)) {</span>&nbsp; <span class='diff-add'> line = merged.find(1, true).line;</span>&nbsp; <span class='diff-add'> (lines || (lines = [])).push(line);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return lines;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Get the line number of the start of the visual line that the</span>&nbsp; <span class='diff-add'> // given line number is part of.</span>&nbsp; <span class='diff-add'> function visualLineNo(doc, lineN) {</span>&nbsp; <span class='diff-add'> var line = getLine(doc, lineN), vis = visualLine(line);</span>&nbsp; <span class='diff-add'> if (line == vis) return lineN;</span>&nbsp; <span class='diff-add'> return lineNo(vis);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Get the line number of the start of the next visual line after</span>&nbsp; <span class='diff-add'> // the given line.</span>&nbsp; <span class='diff-add'> function visualLineEndNo(doc, lineN) {</span>&nbsp; <span class='diff-add'> if (lineN > doc.lastLine()) return lineN;</span>&nbsp; <span class='diff-add'> var line = getLine(doc, lineN), merged;</span>&nbsp; <span class='diff-add'> if (!lineIsHidden(doc, line)) return lineN;</span>&nbsp; <span class='diff-add'> while (merged = collapsedSpanAtEnd(line))</span>&nbsp; <span class='diff-add'> line = merged.find(1, true).line;</span>&nbsp; <span class='diff-add'> return lineNo(line) + 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Compute whether a line is hidden. Lines count as hidden when they</span>&nbsp; <span class='diff-add'> // are part of a visual line that starts with another line, or when</span>&nbsp; <span class='diff-add'> // they are entirely covered by collapsed, non-widget span.</span>&nbsp; <span class='diff-add'> function lineIsHidden(doc, line) {</span>&nbsp; <span class='diff-add'> var sps = sawCollapsedSpans && line.markedSpans;</span>&nbsp; <span class='diff-add'> if (sps) for (var sp, i = 0; i < sps.length; ++i) {</span>&nbsp; <span class='diff-add'> sp = sps[i];</span>&nbsp; <span class='diff-add'> if (!sp.marker.collapsed) continue;</span>&nbsp; <span class='diff-add'> if (sp.from == null) return true;</span>&nbsp; <span class='diff-add'> if (sp.marker.widgetNode) continue;</span>&nbsp; <span class='diff-add'> if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function lineIsHiddenInner(doc, line, span) {</span>&nbsp; <span class='diff-add'> if (span.to == null) {</span>&nbsp; <span class='diff-add'> var end = span.marker.find(1, true);</span>&nbsp; <span class='diff-add'> return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (span.marker.inclusiveRight && span.to == line.text.length)</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> for (var sp, i = 0; i < line.markedSpans.length; ++i) {</span>&nbsp; <span class='diff-add'> sp = line.markedSpans[i];</span>&nbsp; <span class='diff-add'> if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&</span>&nbsp; <span class='diff-add'> (sp.to == null || sp.to != span.from) &&</span>&nbsp; <span class='diff-add'> (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&</span>&nbsp; <span class='diff-add'> lineIsHiddenInner(doc, line, sp)) return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // LINE WIDGETS</span>&nbsp; <span class='diff-add'> // Line widgets are block elements displayed above or below a line.</span>&nbsp; <span class='diff-add'> var LineWidget = CodeMirror.LineWidget = function(cm, node, options) {</span>&nbsp; <span class='diff-add'> if (options) for (var opt in options) if (options.hasOwnProperty(opt))</span>&nbsp; <span class='diff-add'> this[opt] = options[opt];</span>&nbsp; <span class='diff-add'> this.cm = cm;</span>&nbsp; <span class='diff-add'> this.node = node;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> eventMixin(LineWidget);</span>&nbsp; <span class='diff-add'> function adjustScrollWhenAboveVisible(cm, line, diff) {</span>&nbsp; <span class='diff-add'> if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))</span>&nbsp; <span class='diff-add'> addToScrollPos(cm, null, diff);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> LineWidget.prototype.clear = function() {</span>&nbsp; <span class='diff-add'> var cm = this.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);</span>&nbsp; <span class='diff-add'> if (no == null || !ws) return;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);</span>&nbsp; <span class='diff-add'> if (!ws.length) line.widgets = null;</span>&nbsp; <span class='diff-add'> var height = widgetHeight(this);</span>&nbsp; <span class='diff-add'> runInOp(cm, function() {</span>&nbsp; <span class='diff-add'> adjustScrollWhenAboveVisible(cm, line, -height);</span>&nbsp; <span class='diff-add'> regLineChange(cm, no, "widget");</span>&nbsp; <span class='diff-add'> updateLineHeight(line, Math.max(0, line.height - height));</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> LineWidget.prototype.changed = function() {</span>&nbsp; <span class='diff-add'> var oldH = this.height, cm = this.cm, line = this.line;</span>&nbsp; <span class='diff-add'> this.height = null;</span>&nbsp; <span class='diff-add'> var diff = widgetHeight(this) - oldH;</span>&nbsp; <span class='diff-add'> if (!diff) return;</span>&nbsp; <span class='diff-add'> runInOp(cm, function() {</span>&nbsp; <span class='diff-add'> cm.curOp.forceUpdate = true;</span>&nbsp; <span class='diff-add'> adjustScrollWhenAboveVisible(cm, line, diff);</span>&nbsp; <span class='diff-add'> updateLineHeight(line, line.height + diff);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function widgetHeight(widget) {</span>&nbsp; <span class='diff-add'> if (widget.height != null) return widget.height;</span>&nbsp; <span class='diff-add'> if (!contains(document.body, widget.node)) {</span>&nbsp; <span class='diff-add'> var parentStyle = "position: relative;";</span>&nbsp; <span class='diff-add'> if (widget.coverGutter)</span>&nbsp; <span class='diff-add'> parentStyle += "margin-left: -" + widget.cm.getGutterElement().offsetWidth + "px;";</span>&nbsp; <span class='diff-add'> removeChildrenAndAdd(widget.cm.display.measure, elt("div", [widget.node], null, parentStyle));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return widget.height = widget.node.offsetHeight;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function addLineWidget(cm, handle, node, options) {</span>&nbsp; <span class='diff-add'> var widget = new LineWidget(cm, node, options);</span>&nbsp; <span class='diff-add'> if (widget.noHScroll) cm.display.alignWidgets = true;</span>&nbsp; <span class='diff-add'> changeLine(cm.doc, handle, "widget", function(line) {</span>&nbsp; <span class='diff-add'> var widgets = line.widgets || (line.widgets = []);</span>&nbsp; <span class='diff-add'> if (widget.insertAt == null) widgets.push(widget);</span>&nbsp; <span class='diff-add'> else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);</span>&nbsp; <span class='diff-add'> widget.line = line;</span>&nbsp; <span class='diff-add'> if (!lineIsHidden(cm.doc, line)) {</span>&nbsp; <span class='diff-add'> var aboveVisible = heightAtLine(line) < cm.doc.scrollTop;</span>&nbsp; <span class='diff-add'> updateLineHeight(line, line.height + widgetHeight(widget));</span>&nbsp; <span class='diff-add'> if (aboveVisible) addToScrollPos(cm, null, widget.height);</span>&nbsp; <span class='diff-add'> cm.curOp.forceUpdate = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return widget;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // LINE DATA STRUCTURE</span>&nbsp; <span class='diff-add'> // Line objects. These hold state related to a line, including</span>&nbsp; <span class='diff-add'> // highlighting info (the styles array).</span>&nbsp; <span class='diff-add'> var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {</span>&nbsp; <span class='diff-add'> this.text = text;</span>&nbsp; <span class='diff-add'> attachMarkedSpans(this, markedSpans);</span>&nbsp; <span class='diff-add'> this.height = estimateHeight ? estimateHeight(this) : 1;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> eventMixin(Line);</span>&nbsp; <span class='diff-add'> Line.prototype.lineNo = function() { return lineNo(this); };</span>&nbsp; <span class='diff-add'> // Change the content (text, markers) of a line. Automatically</span>&nbsp; <span class='diff-add'> // invalidates cached information and tries to re-estimate the</span>&nbsp; <span class='diff-add'> // line's height.</span>&nbsp; <span class='diff-add'> function updateLine(line, text, markedSpans, estimateHeight) {</span>&nbsp; <span class='diff-add'> line.text = text;</span>&nbsp; <span class='diff-add'> if (line.stateAfter) line.stateAfter = null;</span>&nbsp; <span class='diff-add'> if (line.styles) line.styles = null;</span>&nbsp; <span class='diff-add'> if (line.order != null) line.order = null;</span>&nbsp; <span class='diff-add'> detachMarkedSpans(line);</span>&nbsp; <span class='diff-add'> attachMarkedSpans(line, markedSpans);</span>&nbsp; <span class='diff-add'> var estHeight = estimateHeight ? estimateHeight(line) : 1;</span>&nbsp; <span class='diff-add'> if (estHeight != line.height) updateLineHeight(line, estHeight);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Detach a line from the document tree and its markers.</span>&nbsp; <span class='diff-add'> function cleanUpLine(line) {</span>&nbsp; <span class='diff-add'> line.parent = null;</span>&nbsp; <span class='diff-add'> detachMarkedSpans(line);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function extractLineClasses(type, output) {</span>&nbsp; <span class='diff-add'> if (type) for (;;) {</span>&nbsp; <span class='diff-add'> var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);</span>&nbsp; <span class='diff-add'> if (!lineClass) break;</span>&nbsp; <span class='diff-add'> type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);</span>&nbsp; <span class='diff-add'> var prop = lineClass[1] ? "bgClass" : "textClass";</span>&nbsp; <span class='diff-add'> if (output[prop] == null)</span>&nbsp; <span class='diff-add'> output[prop] = lineClass[2];</span>&nbsp; <span class='diff-add'> else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop]))</span>&nbsp; <span class='diff-add'> output[prop] += " " + lineClass[2];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return type;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function callBlankLine(mode, state) {</span>&nbsp; <span class='diff-add'> if (mode.blankLine) return mode.blankLine(state);</span>&nbsp; <span class='diff-add'> if (!mode.innerMode) return;</span>&nbsp; <span class='diff-add'> var inner = CodeMirror.innerMode(mode, state);</span>&nbsp; <span class='diff-add'> if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function readToken(mode, stream, state, inner) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < 10; i++) {</span>&nbsp; <span class='diff-add'> if (inner) inner[0] = CodeMirror.innerMode(mode, state).mode;</span>&nbsp; <span class='diff-add'> var style = mode.token(stream, state);</span>&nbsp; <span class='diff-add'> if (stream.pos > stream.start) return style;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> throw new Error("Mode " + mode.name + " failed to advance stream.");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Utility for getTokenAt and getLineTokens</span>&nbsp; <span class='diff-add'> function takeToken(cm, pos, precise, asArray) {</span>&nbsp; <span class='diff-add'> function getObj(copy) {</span>&nbsp; <span class='diff-add'> return {start: stream.start, end: stream.pos,</span>&nbsp; <span class='diff-add'> string: stream.current(),</span>&nbsp; <span class='diff-add'> type: style || null,</span>&nbsp; <span class='diff-add'> state: copy ? copyState(doc.mode, state) : state};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var doc = cm.doc, mode = doc.mode, style;</span>&nbsp; <span class='diff-add'> pos = clipPos(doc, pos);</span>&nbsp; <span class='diff-add'> var line = getLine(doc, pos.line), state = getStateBefore(cm, pos.line, precise);</span>&nbsp; <span class='diff-add'> var stream = new StringStream(line.text, cm.options.tabSize), tokens;</span>&nbsp; <span class='diff-add'> if (asArray) tokens = [];</span>&nbsp; <span class='diff-add'> while ((asArray || stream.pos < pos.ch) && !stream.eol()) {</span>&nbsp; <span class='diff-add'> stream.start = stream.pos;</span>&nbsp; <span class='diff-add'> style = readToken(mode, stream, state);</span>&nbsp; <span class='diff-add'> if (asArray) tokens.push(getObj(true));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return asArray ? tokens : getObj();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Run the given mode's parser over a line, calling f for each token.</span>&nbsp; <span class='diff-add'> function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {</span>&nbsp; <span class='diff-add'> var flattenSpans = mode.flattenSpans;</span>&nbsp; <span class='diff-add'> if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;</span>&nbsp; <span class='diff-add'> var curStart = 0, curStyle = null;</span>&nbsp; <span class='diff-add'> var stream = new StringStream(text, cm.options.tabSize), style;</span>&nbsp; <span class='diff-add'> var inner = cm.options.addModeClass && [null];</span>&nbsp; <span class='diff-add'> if (text == "") extractLineClasses(callBlankLine(mode, state), lineClasses);</span>&nbsp; <span class='diff-add'> while (!stream.eol()) {</span>&nbsp; <span class='diff-add'> if (stream.pos > cm.options.maxHighlightLength) {</span>&nbsp; <span class='diff-add'> flattenSpans = false;</span>&nbsp; <span class='diff-add'> if (forceToEnd) processLine(cm, text, state, stream.pos);</span>&nbsp; <span class='diff-add'> stream.pos = text.length;</span>&nbsp; <span class='diff-add'> style = null;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> style = extractLineClasses(readToken(mode, stream, state, inner), lineClasses);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inner) {</span>&nbsp; <span class='diff-add'> var mName = inner[0].name;</span>&nbsp; <span class='diff-add'> if (mName) style = "m-" + (style ? mName + " " + style : mName);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!flattenSpans || curStyle != style) {</span>&nbsp; <span class='diff-add'> while (curStart < stream.start) {</span>&nbsp; <span class='diff-add'> curStart = Math.min(stream.start, curStart + 50000);</span>&nbsp; <span class='diff-add'> f(curStart, curStyle);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> curStyle = style;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> stream.start = stream.pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> while (curStart < stream.pos) {</span>&nbsp; <span class='diff-add'> // Webkit seems to refuse to render text nodes longer than 57444 characters</span>&nbsp; <span class='diff-add'> var pos = Math.min(stream.pos, curStart + 50000);</span>&nbsp; <span class='diff-add'> f(pos, curStyle);</span>&nbsp; <span class='diff-add'> curStart = pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Compute a style array (an array starting with a mode generation</span>&nbsp; <span class='diff-add'> // -- for invalidation -- followed by pairs of end positions and</span>&nbsp; <span class='diff-add'> // style strings), which is used to highlight the tokens on the</span>&nbsp; <span class='diff-add'> // line.</span>&nbsp; <span class='diff-add'> function highlightLine(cm, line, state, forceToEnd) {</span>&nbsp; <span class='diff-add'> // A styles array always starts with a number identifying the</span>&nbsp; <span class='diff-add'> // mode/overlays that it is based on (for easy invalidation).</span>&nbsp; <span class='diff-add'> var st = [cm.state.modeGen], lineClasses = {};</span>&nbsp; <span class='diff-add'> // Compute the base array of styles</span>&nbsp; <span class='diff-add'> runMode(cm, line.text, cm.doc.mode, state, function(end, style) {</span>&nbsp; <span class='diff-add'> st.push(end, style);</span>&nbsp; <span class='diff-add'> }, lineClasses, forceToEnd);</span>&nbsp; <span class='diff-add'> // Run overlays, adjust style array.</span>&nbsp; <span class='diff-add'> for (var o = 0; o < cm.state.overlays.length; ++o) {</span>&nbsp; <span class='diff-add'> var overlay = cm.state.overlays[o], i = 1, at = 0;</span>&nbsp; <span class='diff-add'> runMode(cm, line.text, overlay.mode, true, function(end, style) {</span>&nbsp; <span class='diff-add'> var start = i;</span>&nbsp; <span class='diff-add'> // Ensure there's a token end at the current position, and that i points at it</span>&nbsp; <span class='diff-add'> while (at < end) {</span>&nbsp; <span class='diff-add'> var i_end = st[i];</span>&nbsp; <span class='diff-add'> if (i_end > end)</span>&nbsp; <span class='diff-add'> st.splice(i, 1, end, st[i+1], i_end);</span>&nbsp; <span class='diff-add'> i += 2;</span>&nbsp; <span class='diff-add'> at = Math.min(end, i_end);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!style) return;</span>&nbsp; <span class='diff-add'> if (overlay.opaque) {</span>&nbsp; <span class='diff-add'> st.splice(start, i - start, end, "cm-overlay " + style);</span>&nbsp; <span class='diff-add'> i = start + 2;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> for (; start < i; start += 2) {</span>&nbsp; <span class='diff-add'> var cur = st[start+1];</span>&nbsp; <span class='diff-add'> st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + style;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, lineClasses);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function getLineStyles(cm, line, updateFrontier) {</span>&nbsp; <span class='diff-add'> if (!line.styles || line.styles[0] != cm.state.modeGen) {</span>&nbsp; <span class='diff-add'> var result = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line)));</span>&nbsp; <span class='diff-add'> line.styles = result.styles;</span>&nbsp; <span class='diff-add'> if (result.classes) line.styleClasses = result.classes;</span>&nbsp; <span class='diff-add'> else if (line.styleClasses) line.styleClasses = null;</span>&nbsp; <span class='diff-add'> if (updateFrontier === cm.doc.frontier) cm.doc.frontier++;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return line.styles;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Lightweight form of highlight -- proceed over this line and</span>&nbsp; <span class='diff-add'> // update state, but don't save a style array. Used for lines that</span>&nbsp; <span class='diff-add'> // aren't currently visible.</span>&nbsp; <span class='diff-add'> function processLine(cm, text, state, startAt) {</span>&nbsp; <span class='diff-add'> var mode = cm.doc.mode;</span>&nbsp; <span class='diff-add'> var stream = new StringStream(text, cm.options.tabSize);</span>&nbsp; <span class='diff-add'> stream.start = stream.pos = startAt || 0;</span>&nbsp; <span class='diff-add'> if (text == "") callBlankLine(mode, state);</span>&nbsp; <span class='diff-add'> while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) {</span>&nbsp; <span class='diff-add'> readToken(mode, stream, state);</span>&nbsp; <span class='diff-add'> stream.start = stream.pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Convert a style as returned by a mode (either null, or a string</span>&nbsp; <span class='diff-add'> // containing one or more styles) to a CSS style. This is cached,</span>&nbsp; <span class='diff-add'> // and also looks for line-wide styles.</span>&nbsp; <span class='diff-add'> var styleToClassCache = {}, styleToClassCacheWithMode = {};</span>&nbsp; <span class='diff-add'> function interpretTokenStyle(style, options) {</span>&nbsp; <span class='diff-add'> if (!style || /^\s*$/.test(style)) return null;</span>&nbsp; <span class='diff-add'> var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;</span>&nbsp; <span class='diff-add'> return cache[style] ||</span>&nbsp; <span class='diff-add'> (cache[style] = style.replace(/\S+/g, "cm-$&"));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Render the DOM representation of the text of a line. Also builds</span>&nbsp; <span class='diff-add'> // up a 'line map', which points at the DOM nodes that represent</span>&nbsp; <span class='diff-add'> // specific stretches of text, and is used by the measuring code.</span>&nbsp; <span class='diff-add'> // The returned object contains the DOM node, this map, and</span>&nbsp; <span class='diff-add'> // information about line-wide styles that were set by the mode.</span>&nbsp; <span class='diff-add'> function buildLineContent(cm, lineView) {</span>&nbsp; <span class='diff-add'> // The padding-right forces the element to have a 'border', which</span>&nbsp; <span class='diff-add'> // is needed on Webkit to be able to get line-level bounding</span>&nbsp; <span class='diff-add'> // rectangles for it (in measureChar).</span>&nbsp; <span class='diff-add'> var content = elt("span", null, null, webkit ? "padding-right: .1px" : null);</span>&nbsp; <span class='diff-add'> var builder = {pre: elt("pre", [content]), content: content, col: 0, pos: 0, cm: cm};</span>&nbsp; <span class='diff-add'> lineView.measure = {};</span>&nbsp; <span class='diff-add'> // Iterate over the logical lines that make up this visual line.</span>&nbsp; <span class='diff-add'> for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {</span>&nbsp; <span class='diff-add'> var line = i ? lineView.rest[i - 1] : lineView.line, order;</span>&nbsp; <span class='diff-add'> builder.pos = 0;</span>&nbsp; <span class='diff-add'> builder.addToken = buildToken;</span>&nbsp; <span class='diff-add'> // Optionally wire in some hacks into the token-rendering</span>&nbsp; <span class='diff-add'> // algorithm, to deal with browser quirks.</span>&nbsp; <span class='diff-add'> if ((ie || webkit) && cm.getOption("lineWrapping"))</span>&nbsp; <span class='diff-add'> builder.addToken = buildTokenSplitSpaces(builder.addToken);</span>&nbsp; <span class='diff-add'> if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))</span>&nbsp; <span class='diff-add'> builder.addToken = buildTokenBadBidi(builder.addToken, order);</span>&nbsp; <span class='diff-add'> builder.map = [];</span>&nbsp; <span class='diff-add'> var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);</span>&nbsp; <span class='diff-add'> insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));</span>&nbsp; <span class='diff-add'> if (line.styleClasses) {</span>&nbsp; <span class='diff-add'> if (line.styleClasses.bgClass)</span>&nbsp; <span class='diff-add'> builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || "");</span>&nbsp; <span class='diff-add'> if (line.styleClasses.textClass)</span>&nbsp; <span class='diff-add'> builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || "");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Ensure at least a single node is present, for measuring.</span>&nbsp; <span class='diff-add'> if (builder.map.length == 0)</span>&nbsp; <span class='diff-add'> builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)));</span>&nbsp; <span class='diff-add'> // Store the map and a cache object for the current logical line</span>&nbsp; <span class='diff-add'> if (i == 0) {</span>&nbsp; <span class='diff-add'> lineView.measure.map = builder.map;</span>&nbsp; <span class='diff-add'> lineView.measure.cache = {};</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map);</span>&nbsp; <span class='diff-add'> (lineView.measure.caches || (lineView.measure.caches = [])).push({});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // See issue #2901</span>&nbsp; <span class='diff-add'> if (webkit && /\bcm-tab\b/.test(builder.content.lastChild.className))</span>&nbsp; <span class='diff-add'> builder.content.className = "cm-tab-wrap-hack";</span>&nbsp; <span class='diff-add'> signal(cm, "renderLine", cm, lineView.line, builder.pre);</span>&nbsp; <span class='diff-add'> if (builder.pre.className)</span>&nbsp; <span class='diff-add'> builder.textClass = joinClasses(builder.pre.className, builder.textClass || "");</span>&nbsp; <span class='diff-add'> return builder;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function defaultSpecialCharPlaceholder(ch) {</span>&nbsp; <span class='diff-add'> var token = elt("span", "\u2022", "cm-invalidchar");</span>&nbsp; <span class='diff-add'> token.title = "\\u" + ch.charCodeAt(0).toString(16);</span>&nbsp; <span class='diff-add'> return token;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Build up the DOM representation for a single token, and add it to</span>&nbsp; <span class='diff-add'> // the line map. Takes care to render special characters separately.</span>&nbsp; <span class='diff-add'> function buildToken(builder, text, style, startStyle, endStyle, title, css) {</span>&nbsp; <span class='diff-add'> if (!text) return;</span>&nbsp; <span class='diff-add'> var special = builder.cm.options.specialChars, mustWrap = false;</span>&nbsp; <span class='diff-add'> if (!special.test(text)) {</span>&nbsp; <span class='diff-add'> builder.col += text.length;</span>&nbsp; <span class='diff-add'> var content = document.createTextNode(text);</span>&nbsp; <span class='diff-add'> builder.map.push(builder.pos, builder.pos + text.length, content);</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 9) mustWrap = true;</span>&nbsp; <span class='diff-add'> builder.pos += text.length;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var content = document.createDocumentFragment(), pos = 0;</span>&nbsp; <span class='diff-add'> while (true) {</span>&nbsp; <span class='diff-add'> special.lastIndex = pos;</span>&nbsp; <span class='diff-add'> var m = special.exec(text);</span>&nbsp; <span class='diff-add'> var skipped = m ? m.index - pos : text.length - pos;</span>&nbsp; <span class='diff-add'> if (skipped) {</span>&nbsp; <span class='diff-add'> var txt = document.createTextNode(text.slice(pos, pos + skipped));</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));</span>&nbsp; <span class='diff-add'> else content.appendChild(txt);</span>&nbsp; <span class='diff-add'> builder.map.push(builder.pos, builder.pos + skipped, txt);</span>&nbsp; <span class='diff-add'> builder.col += skipped;</span>&nbsp; <span class='diff-add'> builder.pos += skipped;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!m) break;</span>&nbsp; <span class='diff-add'> pos += skipped + 1;</span>&nbsp; <span class='diff-add'> if (m[0] == "\t") {</span>&nbsp; <span class='diff-add'> var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;</span>&nbsp; <span class='diff-add'> var txt = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));</span>&nbsp; <span class='diff-add'> builder.col += tabWidth;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var txt = builder.cm.options.specialCharPlaceholder(m[0]);</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));</span>&nbsp; <span class='diff-add'> else content.appendChild(txt);</span>&nbsp; <span class='diff-add'> builder.col += 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> builder.map.push(builder.pos, builder.pos + 1, txt);</span>&nbsp; <span class='diff-add'> builder.pos++;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (style || startStyle || endStyle || mustWrap || css) {</span>&nbsp; <span class='diff-add'> var fullStyle = style || "";</span>&nbsp; <span class='diff-add'> if (startStyle) fullStyle += startStyle;</span>&nbsp; <span class='diff-add'> if (endStyle) fullStyle += endStyle;</span>&nbsp; <span class='diff-add'> var token = elt("span", [content], fullStyle, css);</span>&nbsp; <span class='diff-add'> if (title) token.title = title;</span>&nbsp; <span class='diff-add'> return builder.content.appendChild(token);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> builder.content.appendChild(content);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function buildTokenSplitSpaces(inner) {</span>&nbsp; <span class='diff-add'> function split(old) {</span>&nbsp; <span class='diff-add'> var out = " ";</span>&nbsp; <span class='diff-add'> for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0";</span>&nbsp; <span class='diff-add'> out += " ";</span>&nbsp; <span class='diff-add'> return out;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return function(builder, text, style, startStyle, endStyle, title) {</span>&nbsp; <span class='diff-add'> inner(builder, text.replace(/ {3,}/g, split), style, startStyle, endStyle, title);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Work around nonsense dimensions being reported for stretches of</span>&nbsp; <span class='diff-add'> // right-to-left text.</span>&nbsp; <span class='diff-add'> function buildTokenBadBidi(inner, order) {</span>&nbsp; <span class='diff-add'> return function(builder, text, style, startStyle, endStyle, title) {</span>&nbsp; <span class='diff-add'> style = style ? style + " cm-force-border" : "cm-force-border";</span>&nbsp; <span class='diff-add'> var start = builder.pos, end = start + text.length;</span>&nbsp; <span class='diff-add'> for (;;) {</span>&nbsp; <span class='diff-add'> // Find the part that overlaps with the start of this text</span>&nbsp; <span class='diff-add'> for (var i = 0; i < order.length; i++) {</span>&nbsp; <span class='diff-add'> var part = order[i];</span>&nbsp; <span class='diff-add'> if (part.to > start && part.from <= start) break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title);</span>&nbsp; <span class='diff-add'> inner(builder, text.slice(0, part.to - start), style, startStyle, null, title);</span>&nbsp; <span class='diff-add'> startStyle = null;</span>&nbsp; <span class='diff-add'> text = text.slice(part.to - start);</span>&nbsp; <span class='diff-add'> start = part.to;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function buildCollapsedSpan(builder, size, marker, ignoreWidget) {</span>&nbsp; <span class='diff-add'> var widget = !ignoreWidget && marker.widgetNode;</span>&nbsp; <span class='diff-add'> if (widget) {</span>&nbsp; <span class='diff-add'> builder.map.push(builder.pos, builder.pos + size, widget);</span>&nbsp; <span class='diff-add'> builder.content.appendChild(widget);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> builder.pos += size;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Outputs a number of spans to make up a line, taking highlighting</span>&nbsp; <span class='diff-add'> // and marked text into account.</span>&nbsp; <span class='diff-add'> function insertLineContent(line, builder, styles) {</span>&nbsp; <span class='diff-add'> var spans = line.markedSpans, allText = line.text, at = 0;</span>&nbsp; <span class='diff-add'> if (!spans) {</span>&nbsp; <span class='diff-add'> for (var i = 1; i < styles.length; i+=2)</span>&nbsp; <span class='diff-add'> builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var len = allText.length, pos = 0, i = 1, text = "", style, css;</span>&nbsp; <span class='diff-add'> var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;</span>&nbsp; <span class='diff-add'> for (;;) {</span>&nbsp; <span class='diff-add'> if (nextChange == pos) { // Update current marker set</span>&nbsp; <span class='diff-add'> spanStyle = spanEndStyle = spanStartStyle = title = css = "";</span>&nbsp; <span class='diff-add'> collapsed = null; nextChange = Infinity;</span>&nbsp; <span class='diff-add'> var foundBookmarks = [];</span>&nbsp; <span class='diff-add'> for (var j = 0; j < spans.length; ++j) {</span>&nbsp; <span class='diff-add'> var sp = spans[j], m = sp.marker;</span>&nbsp; <span class='diff-add'> if (sp.from <= pos && (sp.to == null || sp.to > pos)) {</span>&nbsp; <span class='diff-add'> if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; }</span>&nbsp; <span class='diff-add'> if (m.className) spanStyle += " " + m.className;</span>&nbsp; <span class='diff-add'> if (m.css) css = m.css;</span>&nbsp; <span class='diff-add'> if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;</span>&nbsp; <span class='diff-add'> if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle;</span>&nbsp; <span class='diff-add'> if (m.title && !title) title = m.title;</span>&nbsp; <span class='diff-add'> if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))</span>&nbsp; <span class='diff-add'> collapsed = sp;</span>&nbsp; <span class='diff-add'> } else if (sp.from > pos && nextChange > sp.from) {</span>&nbsp; <span class='diff-add'> nextChange = sp.from;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (m.type == "bookmark" && sp.from == pos && m.widgetNode) foundBookmarks.push(m);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (collapsed && (collapsed.from || 0) == pos) {</span>&nbsp; <span class='diff-add'> buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,</span>&nbsp; <span class='diff-add'> collapsed.marker, collapsed.from == null);</span>&nbsp; <span class='diff-add'> if (collapsed.to == null) return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!collapsed && foundBookmarks.length) for (var j = 0; j < foundBookmarks.length; ++j)</span>&nbsp; <span class='diff-add'> buildCollapsedSpan(builder, 0, foundBookmarks[j]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (pos >= len) break;</span>&nbsp; <span class='diff-add'> var upto = Math.min(len, nextChange);</span>&nbsp; <span class='diff-add'> while (true) {</span>&nbsp; <span class='diff-add'> if (text) {</span>&nbsp; <span class='diff-add'> var end = pos + text.length;</span>&nbsp; <span class='diff-add'> if (!collapsed) {</span>&nbsp; <span class='diff-add'> var tokenText = end > upto ? text.slice(0, upto - pos) : text;</span>&nbsp; <span class='diff-add'> builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,</span>&nbsp; <span class='diff-add'> spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}</span>&nbsp; <span class='diff-add'> pos = end;</span>&nbsp; <span class='diff-add'> spanStartStyle = "";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> text = allText.slice(at, at = styles[i++]);</span>&nbsp; <span class='diff-add'> style = interpretTokenStyle(styles[i++], builder.cm.options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // DOCUMENT DATA STRUCTURE</span>&nbsp; <span class='diff-add'> // By default, updates that start and end at the beginning of a line</span>&nbsp; <span class='diff-add'> // are treated specially, in order to make the association of line</span>&nbsp; <span class='diff-add'> // widgets and marker elements with the text behave more intuitive.</span>&nbsp; <span class='diff-add'> function isWholeLineUpdate(doc, change) {</span>&nbsp; <span class='diff-add'> return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&</span>&nbsp; <span class='diff-add'> (!doc.cm || doc.cm.options.wholeLineUpdateBefore);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Perform a change on the document data structure.</span>&nbsp; <span class='diff-add'> function updateDoc(doc, change, markedSpans, estimateHeight) {</span>&nbsp; <span class='diff-add'> function spansFor(n) {return markedSpans ? markedSpans[n] : null;}</span>&nbsp; <span class='diff-add'> function update(line, text, spans) {</span>&nbsp; <span class='diff-add'> updateLine(line, text, spans, estimateHeight);</span>&nbsp; <span class='diff-add'> signalLater(line, "change", line, change);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var from = change.from, to = change.to, text = change.text;</span>&nbsp; <span class='diff-add'> var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);</span>&nbsp; <span class='diff-add'> var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;</span>&nbsp; <span class='diff-add'> // Adjust the line structure</span>&nbsp; <span class='diff-add'> if (isWholeLineUpdate(doc, change)) {</span>&nbsp; <span class='diff-add'> // This is a whole-line replace. Treated specially to make</span>&nbsp; <span class='diff-add'> // sure line objects move the way they are supposed to.</span>&nbsp; <span class='diff-add'> for (var i = 0, added = []; i < text.length - 1; ++i)</span>&nbsp; <span class='diff-add'> added.push(new Line(text[i], spansFor(i), estimateHeight));</span>&nbsp; <span class='diff-add'> update(lastLine, lastLine.text, lastSpans);</span>&nbsp; <span class='diff-add'> if (nlines) doc.remove(from.line, nlines);</span>&nbsp; <span class='diff-add'> if (added.length) doc.insert(from.line, added);</span>&nbsp; <span class='diff-add'> } else if (firstLine == lastLine) {</span>&nbsp; <span class='diff-add'> if (text.length == 1) {</span>&nbsp; <span class='diff-add'> update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> for (var added = [], i = 1; i < text.length - 1; ++i)</span>&nbsp; <span class='diff-add'> added.push(new Line(text[i], spansFor(i), estimateHeight));</span>&nbsp; <span class='diff-add'> added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));</span>&nbsp; <span class='diff-add'> update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));</span>&nbsp; <span class='diff-add'> doc.insert(from.line + 1, added);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (text.length == 1) {</span>&nbsp; <span class='diff-add'> update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));</span>&nbsp; <span class='diff-add'> doc.remove(from.line + 1, nlines);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));</span>&nbsp; <span class='diff-add'> update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);</span>&nbsp; <span class='diff-add'> for (var i = 1, added = []; i < text.length - 1; ++i)</span>&nbsp; <span class='diff-add'> added.push(new Line(text[i], spansFor(i), estimateHeight));</span>&nbsp; <span class='diff-add'> if (nlines > 1) doc.remove(from.line + 1, nlines - 1);</span>&nbsp; <span class='diff-add'> doc.insert(from.line + 1, added);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> signalLater(doc, "change", doc, change);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // The document is represented as a BTree consisting of leaves, with</span>&nbsp; <span class='diff-add'> // chunk of lines in them, and branches, with up to ten leaves or</span>&nbsp; <span class='diff-add'> // other branch nodes below them. The top node is always a branch</span>&nbsp; <span class='diff-add'> // node, and is the document object itself (meaning it has</span>&nbsp; <span class='diff-add'> // additional methods and properties).</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // All nodes have parent links. The tree is used both to go from</span>&nbsp; <span class='diff-add'> // line numbers to line objects, and to go from objects to numbers.</span>&nbsp; <span class='diff-add'> // It also indexes by height, and is used to convert between height</span>&nbsp; <span class='diff-add'> // and line object, and to find the total height of the document.</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html</span>&nbsp; <span class='diff-add'> function LeafChunk(lines) {</span>&nbsp; <span class='diff-add'> this.lines = lines;</span>&nbsp; <span class='diff-add'> this.parent = null;</span>&nbsp; <span class='diff-add'> for (var i = 0, height = 0; i < lines.length; ++i) {</span>&nbsp; <span class='diff-add'> lines[i].parent = this;</span>&nbsp; <span class='diff-add'> height += lines[i].height;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.height = height;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> LeafChunk.prototype = {</span>&nbsp; <span class='diff-add'> chunkSize: function() { return this.lines.length; },</span>&nbsp; <span class='diff-add'> // Remove the n lines at offset 'at'.</span>&nbsp; <span class='diff-add'> removeInner: function(at, n) {</span>&nbsp; <span class='diff-add'> for (var i = at, e = at + n; i < e; ++i) {</span>&nbsp; <span class='diff-add'> var line = this.lines[i];</span>&nbsp; <span class='diff-add'> this.height -= line.height;</span>&nbsp; <span class='diff-add'> cleanUpLine(line);</span>&nbsp; <span class='diff-add'> signalLater(line, "delete");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.lines.splice(at, n);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> // Helper used to collapse a small branch into a single leaf.</span>&nbsp; <span class='diff-add'> collapse: function(lines) {</span>&nbsp; <span class='diff-add'> lines.push.apply(lines, this.lines);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> // Insert the given array of lines at offset 'at', count them as</span>&nbsp; <span class='diff-add'> // having the given height.</span>&nbsp; <span class='diff-add'> insertInner: function(at, lines, height) {</span>&nbsp; <span class='diff-add'> this.height += height;</span>&nbsp; <span class='diff-add'> this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));</span>&nbsp; <span class='diff-add'> for (var i = 0; i < lines.length; ++i) lines[i].parent = this;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> // Used to iterate over a part of the tree.</span>&nbsp; <span class='diff-add'> iterN: function(at, n, op) {</span>&nbsp; <span class='diff-add'> for (var e = at + n; at < e; ++at)</span>&nbsp; <span class='diff-add'> if (op(this.lines[at])) return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function BranchChunk(children) {</span>&nbsp; <span class='diff-add'> this.children = children;</span>&nbsp; <span class='diff-add'> var size = 0, height = 0;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < children.length; ++i) {</span>&nbsp; <span class='diff-add'> var ch = children[i];</span>&nbsp; <span class='diff-add'> size += ch.chunkSize(); height += ch.height;</span>&nbsp; <span class='diff-add'> ch.parent = this;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.size = size;</span>&nbsp; <span class='diff-add'> this.height = height;</span>&nbsp; <span class='diff-add'> this.parent = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> BranchChunk.prototype = {</span>&nbsp; <span class='diff-add'> chunkSize: function() { return this.size; },</span>&nbsp; <span class='diff-add'> removeInner: function(at, n) {</span>&nbsp; <span class='diff-add'> this.size -= n;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.children.length; ++i) {</span>&nbsp; <span class='diff-add'> var child = this.children[i], sz = child.chunkSize();</span>&nbsp; <span class='diff-add'> if (at < sz) {</span>&nbsp; <span class='diff-add'> var rm = Math.min(n, sz - at), oldHeight = child.height;</span>&nbsp; <span class='diff-add'> child.removeInner(at, rm);</span>&nbsp; <span class='diff-add'> this.height -= oldHeight - child.height;</span>&nbsp; <span class='diff-add'> if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }</span>&nbsp; <span class='diff-add'> if ((n -= rm) == 0) break;</span>&nbsp; <span class='diff-add'> at = 0;</span>&nbsp; <span class='diff-add'> } else at -= sz;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // If the result is smaller than 25 lines, ensure that it is a</span>&nbsp; <span class='diff-add'> // single leaf node.</span>&nbsp; <span class='diff-add'> if (this.size - n < 25 &&</span>&nbsp; <span class='diff-add'> (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {</span>&nbsp; <span class='diff-add'> var lines = [];</span>&nbsp; <span class='diff-add'> this.collapse(lines);</span>&nbsp; <span class='diff-add'> this.children = [new LeafChunk(lines)];</span>&nbsp; <span class='diff-add'> this.children[0].parent = this;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> collapse: function(lines) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> insertInner: function(at, lines, height) {</span>&nbsp; <span class='diff-add'> this.size += lines.length;</span>&nbsp; <span class='diff-add'> this.height += height;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.children.length; ++i) {</span>&nbsp; <span class='diff-add'> var child = this.children[i], sz = child.chunkSize();</span>&nbsp; <span class='diff-add'> if (at <= sz) {</span>&nbsp; <span class='diff-add'> child.insertInner(at, lines, height);</span>&nbsp; <span class='diff-add'> if (child.lines && child.lines.length > 50) {</span>&nbsp; <span class='diff-add'> while (child.lines.length > 50) {</span>&nbsp; <span class='diff-add'> var spilled = child.lines.splice(child.lines.length - 25, 25);</span>&nbsp; <span class='diff-add'> var newleaf = new LeafChunk(spilled);</span>&nbsp; <span class='diff-add'> child.height -= newleaf.height;</span>&nbsp; <span class='diff-add'> this.children.splice(i + 1, 0, newleaf);</span>&nbsp; <span class='diff-add'> newleaf.parent = this;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.maybeSpill();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> at -= sz;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> // When a node has grown, check whether it should be split.</span>&nbsp; <span class='diff-add'> maybeSpill: function() {</span>&nbsp; <span class='diff-add'> if (this.children.length <= 10) return;</span>&nbsp; <span class='diff-add'> var me = this;</span>&nbsp; <span class='diff-add'> do {</span>&nbsp; <span class='diff-add'> var spilled = me.children.splice(me.children.length - 5, 5);</span>&nbsp; <span class='diff-add'> var sibling = new BranchChunk(spilled);</span>&nbsp; <span class='diff-add'> if (!me.parent) { // Become the parent node</span>&nbsp; <span class='diff-add'> var copy = new BranchChunk(me.children);</span>&nbsp; <span class='diff-add'> copy.parent = me;</span>&nbsp; <span class='diff-add'> me.children = [copy, sibling];</span>&nbsp; <span class='diff-add'> me = copy;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> me.size -= sibling.size;</span>&nbsp; <span class='diff-add'> me.height -= sibling.height;</span>&nbsp; <span class='diff-add'> var myIndex = indexOf(me.parent.children, me);</span>&nbsp; <span class='diff-add'> me.parent.children.splice(myIndex + 1, 0, sibling);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> sibling.parent = me.parent;</span>&nbsp; <span class='diff-add'> } while (me.children.length > 10);</span>&nbsp; <span class='diff-add'> me.parent.maybeSpill();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> iterN: function(at, n, op) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.children.length; ++i) {</span>&nbsp; <span class='diff-add'> var child = this.children[i], sz = child.chunkSize();</span>&nbsp; <span class='diff-add'> if (at < sz) {</span>&nbsp; <span class='diff-add'> var used = Math.min(n, sz - at);</span>&nbsp; <span class='diff-add'> if (child.iterN(at, used, op)) return true;</span>&nbsp; <span class='diff-add'> if ((n -= used) == 0) break;</span>&nbsp; <span class='diff-add'> at = 0;</span>&nbsp; <span class='diff-add'> } else at -= sz;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var nextDocId = 0;</span>&nbsp; <span class='diff-add'> var Doc = CodeMirror.Doc = function(text, mode, firstLine) {</span>&nbsp; <span class='diff-add'> if (!(this instanceof Doc)) return new Doc(text, mode, firstLine);</span>&nbsp; <span class='diff-add'> if (firstLine == null) firstLine = 0;</span>&nbsp; <span class='diff-add'> BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);</span>&nbsp; <span class='diff-add'> this.first = firstLine;</span>&nbsp; <span class='diff-add'> this.scrollTop = this.scrollLeft = 0;</span>&nbsp; <span class='diff-add'> this.cantEdit = false;</span>&nbsp; <span class='diff-add'> this.cleanGeneration = 1;</span>&nbsp; <span class='diff-add'> this.frontier = firstLine;</span>&nbsp; <span class='diff-add'> var start = Pos(firstLine, 0);</span>&nbsp; <span class='diff-add'> this.sel = simpleSelection(start);</span>&nbsp; <span class='diff-add'> this.history = new History(null);</span>&nbsp; <span class='diff-add'> this.id = ++nextDocId;</span>&nbsp; <span class='diff-add'> this.modeOption = mode;</span>&nbsp; <span class='diff-add'> if (typeof text == "string") text = splitLines(text);</span>&nbsp; <span class='diff-add'> updateDoc(this, {from: start, to: start, text: text});</span>&nbsp; <span class='diff-add'> setSelection(this, simpleSelection(start), sel_dontScroll);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Doc.prototype = createObj(BranchChunk.prototype, {</span>&nbsp; <span class='diff-add'> constructor: Doc,</span>&nbsp; <span class='diff-add'> // Iterate over the document. Supports two forms -- with only one</span>&nbsp; <span class='diff-add'> // argument, it calls that for each line in the document. With</span>&nbsp; <span class='diff-add'> // three, it iterates over the range given by the first two (with</span>&nbsp; <span class='diff-add'> // the second being non-inclusive).</span>&nbsp; <span class='diff-add'> iter: function(from, to, op) {</span>&nbsp; <span class='diff-add'> if (op) this.iterN(from - this.first, to - from, op);</span>&nbsp; <span class='diff-add'> else this.iterN(this.first, this.first + this.size, from);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> // Non-public interface for adding and removing lines.</span>&nbsp; <span class='diff-add'> insert: function(at, lines) {</span>&nbsp; <span class='diff-add'> var height = 0;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < lines.length; ++i) height += lines[i].height;</span>&nbsp; <span class='diff-add'> this.insertInner(at - this.first, lines, height);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> remove: function(at, n) { this.removeInner(at - this.first, n); },</span>&nbsp; <span class='diff-add'> // From here, the methods are part of the public interface. Most</span>&nbsp; <span class='diff-add'> // are also available from CodeMirror (editor) instances.</span>&nbsp; <span class='diff-add'> getValue: function(lineSep) {</span>&nbsp; <span class='diff-add'> var lines = getLines(this, this.first, this.first + this.size);</span>&nbsp; <span class='diff-add'> if (lineSep === false) return lines;</span>&nbsp; <span class='diff-add'> return lines.join(lineSep || "\n");</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> setValue: docMethodOp(function(code) {</span>&nbsp; <span class='diff-add'> var top = Pos(this.first, 0), last = this.first + this.size - 1;</span>&nbsp; <span class='diff-add'> makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),</span>&nbsp; <span class='diff-add'> text: splitLines(code), origin: "setValue"}, true);</span>&nbsp; <span class='diff-add'> setSelection(this, simpleSelection(top));</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> replaceRange: function(code, from, to, origin) {</span>&nbsp; <span class='diff-add'> from = clipPos(this, from);</span>&nbsp; <span class='diff-add'> to = to ? clipPos(this, to) : from;</span>&nbsp; <span class='diff-add'> replaceRange(this, code, from, to, origin);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getRange: function(from, to, lineSep) {</span>&nbsp; <span class='diff-add'> var lines = getBetween(this, clipPos(this, from), clipPos(this, to));</span>&nbsp; <span class='diff-add'> if (lineSep === false) return lines;</span>&nbsp; <span class='diff-add'> return lines.join(lineSep || "\n");</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},</span>&nbsp; <span class='diff-add'> getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},</span>&nbsp; <span class='diff-add'> getLineNumber: function(line) {return lineNo(line);},</span>&nbsp; <span class='diff-add'> getLineHandleVisualStart: function(line) {</span>&nbsp; <span class='diff-add'> if (typeof line == "number") line = getLine(this, line);</span>&nbsp; <span class='diff-add'> return visualLine(line);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> lineCount: function() {return this.size;},</span>&nbsp; <span class='diff-add'> firstLine: function() {return this.first;},</span>&nbsp; <span class='diff-add'> lastLine: function() {return this.first + this.size - 1;},</span>&nbsp; <span class='diff-add'> clipPos: function(pos) {return clipPos(this, pos);},</span>&nbsp; <span class='diff-add'> getCursor: function(start) {</span>&nbsp; <span class='diff-add'> var range = this.sel.primary(), pos;</span>&nbsp; <span class='diff-add'> if (start == null || start == "head") pos = range.head;</span>&nbsp; <span class='diff-add'> else if (start == "anchor") pos = range.anchor;</span>&nbsp; <span class='diff-add'> else if (start == "end" || start == "to" || start === false) pos = range.to();</span>&nbsp; <span class='diff-add'> else pos = range.from();</span>&nbsp; <span class='diff-add'> return pos;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> listSelections: function() { return this.sel.ranges; },</span>&nbsp; <span class='diff-add'> somethingSelected: function() {return this.sel.somethingSelected();},</span>&nbsp; <span class='diff-add'> setCursor: docMethodOp(function(line, ch, options) {</span>&nbsp; <span class='diff-add'> setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> setSelection: docMethodOp(function(anchor, head, options) {</span>&nbsp; <span class='diff-add'> setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> extendSelection: docMethodOp(function(head, other, options) {</span>&nbsp; <span class='diff-add'> extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> extendSelections: docMethodOp(function(heads, options) {</span>&nbsp; <span class='diff-add'> extendSelections(this, clipPosArray(this, heads, options));</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> extendSelectionsBy: docMethodOp(function(f, options) {</span>&nbsp; <span class='diff-add'> extendSelections(this, map(this.sel.ranges, f), options);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> setSelections: docMethodOp(function(ranges, primary, options) {</span>&nbsp; <span class='diff-add'> if (!ranges.length) return;</span>&nbsp; <span class='diff-add'> for (var i = 0, out = []; i < ranges.length; i++)</span>&nbsp; <span class='diff-add'> out[i] = new Range(clipPos(this, ranges[i].anchor),</span>&nbsp; <span class='diff-add'> clipPos(this, ranges[i].head));</span>&nbsp; <span class='diff-add'> if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex);</span>&nbsp; <span class='diff-add'> setSelection(this, normalizeSelection(out, primary), options);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> addSelection: docMethodOp(function(anchor, head, options) {</span>&nbsp; <span class='diff-add'> var ranges = this.sel.ranges.slice(0);</span>&nbsp; <span class='diff-add'> ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));</span>&nbsp; <span class='diff-add'> setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> getSelection: function(lineSep) {</span>&nbsp; <span class='diff-add'> var ranges = this.sel.ranges, lines;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var sel = getBetween(this, ranges[i].from(), ranges[i].to());</span>&nbsp; <span class='diff-add'> lines = lines ? lines.concat(sel) : sel;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (lineSep === false) return lines;</span>&nbsp; <span class='diff-add'> else return lines.join(lineSep || "\n");</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getSelections: function(lineSep) {</span>&nbsp; <span class='diff-add'> var parts = [], ranges = this.sel.ranges;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var sel = getBetween(this, ranges[i].from(), ranges[i].to());</span>&nbsp; <span class='diff-add'> if (lineSep !== false) sel = sel.join(lineSep || "\n");</span>&nbsp; <span class='diff-add'> parts[i] = sel;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return parts;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> replaceSelection: function(code, collapse, origin) {</span>&nbsp; <span class='diff-add'> var dup = [];</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.sel.ranges.length; i++)</span>&nbsp; <span class='diff-add'> dup[i] = code;</span>&nbsp; <span class='diff-add'> this.replaceSelections(dup, collapse, origin || "+input");</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> replaceSelections: docMethodOp(function(code, collapse, origin) {</span>&nbsp; <span class='diff-add'> var changes = [], sel = this.sel;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < sel.ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var range = sel.ranges[i];</span>&nbsp; <span class='diff-add'> changes[i] = {from: range.from(), to: range.to(), text: splitLines(code[i]), origin: origin};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse);</span>&nbsp; <span class='diff-add'> for (var i = changes.length - 1; i >= 0; i--)</span>&nbsp; <span class='diff-add'> makeChange(this, changes[i]);</span>&nbsp; <span class='diff-add'> if (newSel) setSelectionReplaceHistory(this, newSel);</span>&nbsp; <span class='diff-add'> else if (this.cm) ensureCursorVisible(this.cm);</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),</span>&nbsp; <span class='diff-add'> redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),</span>&nbsp; <span class='diff-add'> undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),</span>&nbsp; <span class='diff-add'> redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}),</span>&nbsp; <span class='diff-add'> setExtending: function(val) {this.extend = val;},</span>&nbsp; <span class='diff-add'> getExtending: function() {return this.extend;},</span>&nbsp; <span class='diff-add'> historySize: function() {</span>&nbsp; <span class='diff-add'> var hist = this.history, done = 0, undone = 0;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone;</span>&nbsp; <span class='diff-add'> return {undo: done, redo: undone};</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> clearHistory: function() {this.history = new History(this.history.maxGeneration);},</span>&nbsp; <span class='diff-add'> markClean: function() {</span>&nbsp; <span class='diff-add'> this.cleanGeneration = this.changeGeneration(true);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> changeGeneration: function(forceSplit) {</span>&nbsp; <span class='diff-add'> if (forceSplit)</span>&nbsp; <span class='diff-add'> this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null;</span>&nbsp; <span class='diff-add'> return this.history.generation;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isClean: function (gen) {</span>&nbsp; <span class='diff-add'> return this.history.generation == (gen || this.cleanGeneration);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getHistory: function() {</span>&nbsp; <span class='diff-add'> return {done: copyHistoryArray(this.history.done),</span>&nbsp; <span class='diff-add'> undone: copyHistoryArray(this.history.undone)};</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> setHistory: function(histData) {</span>&nbsp; <span class='diff-add'> var hist = this.history = new History(this.history.maxGeneration);</span>&nbsp; <span class='diff-add'> hist.done = copyHistoryArray(histData.done.slice(0), null, true);</span>&nbsp; <span class='diff-add'> hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> addLineClass: docMethodOp(function(handle, where, cls) {</span>&nbsp; <span class='diff-add'> return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {</span>&nbsp; <span class='diff-add'> var prop = where == "text" ? "textClass"</span>&nbsp; <span class='diff-add'> : where == "background" ? "bgClass"</span>&nbsp; <span class='diff-add'> : where == "gutter" ? "gutterClass" : "wrapClass";</span>&nbsp; <span class='diff-add'> if (!line[prop]) line[prop] = cls;</span>&nbsp; <span class='diff-add'> else if (classTest(cls).test(line[prop])) return false;</span>&nbsp; <span class='diff-add'> else line[prop] += " " + cls;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> removeLineClass: docMethodOp(function(handle, where, cls) {</span>&nbsp; <span class='diff-add'> return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {</span>&nbsp; <span class='diff-add'> var prop = where == "text" ? "textClass"</span>&nbsp; <span class='diff-add'> : where == "background" ? "bgClass"</span>&nbsp; <span class='diff-add'> : where == "gutter" ? "gutterClass" : "wrapClass";</span>&nbsp; <span class='diff-add'> var cur = line[prop];</span>&nbsp; <span class='diff-add'> if (!cur) return false;</span>&nbsp; <span class='diff-add'> else if (cls == null) line[prop] = null;</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> var found = cur.match(classTest(cls));</span>&nbsp; <span class='diff-add'> if (!found) return false;</span>&nbsp; <span class='diff-add'> var end = found.index + found[0].length;</span>&nbsp; <span class='diff-add'> line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }),</span>&nbsp; <span class='diff-add'> markText: function(from, to, options) {</span>&nbsp; <span class='diff-add'> return markText(this, clipPos(this, from), clipPos(this, to), options, "range");</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> setBookmark: function(pos, options) {</span>&nbsp; <span class='diff-add'> var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),</span>&nbsp; <span class='diff-add'> insertLeft: options && options.insertLeft,</span>&nbsp; <span class='diff-add'> clearWhenEmpty: false, shared: options && options.shared};</span>&nbsp; <span class='diff-add'> pos = clipPos(this, pos);</span>&nbsp; <span class='diff-add'> return markText(this, pos, pos, realOpts, "bookmark");</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> findMarksAt: function(pos) {</span>&nbsp; <span class='diff-add'> pos = clipPos(this, pos);</span>&nbsp; <span class='diff-add'> var markers = [], spans = getLine(this, pos.line).markedSpans;</span>&nbsp; <span class='diff-add'> if (spans) for (var i = 0; i < spans.length; ++i) {</span>&nbsp; <span class='diff-add'> var span = spans[i];</span>&nbsp; <span class='diff-add'> if ((span.from == null || span.from <= pos.ch) &&</span>&nbsp; <span class='diff-add'> (span.to == null || span.to >= pos.ch))</span>&nbsp; <span class='diff-add'> markers.push(span.marker.parent || span.marker);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return markers;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> findMarks: function(from, to, filter) {</span>&nbsp; <span class='diff-add'> from = clipPos(this, from); to = clipPos(this, to);</span>&nbsp; <span class='diff-add'> var found = [], lineNo = from.line;</span>&nbsp; <span class='diff-add'> this.iter(from.line, to.line + 1, function(line) {</span>&nbsp; <span class='diff-add'> var spans = line.markedSpans;</span>&nbsp; <span class='diff-add'> if (spans) for (var i = 0; i < spans.length; i++) {</span>&nbsp; <span class='diff-add'> var span = spans[i];</span>&nbsp; <span class='diff-add'> if (!(lineNo == from.line && from.ch > span.to ||</span>&nbsp; <span class='diff-add'> span.from == null && lineNo != from.line||</span>&nbsp; <span class='diff-add'> lineNo == to.line && span.from > to.ch) &&</span>&nbsp; <span class='diff-add'> (!filter || filter(span.marker)))</span>&nbsp; <span class='diff-add'> found.push(span.marker.parent || span.marker);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ++lineNo;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return found;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> getAllMarks: function() {</span>&nbsp; <span class='diff-add'> var markers = [];</span>&nbsp; <span class='diff-add'> this.iter(function(line) {</span>&nbsp; <span class='diff-add'> var sps = line.markedSpans;</span>&nbsp; <span class='diff-add'> if (sps) for (var i = 0; i < sps.length; ++i)</span>&nbsp; <span class='diff-add'> if (sps[i].from != null) markers.push(sps[i].marker);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return markers;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> posFromIndex: function(off) {</span>&nbsp; <span class='diff-add'> var ch, lineNo = this.first;</span>&nbsp; <span class='diff-add'> this.iter(function(line) {</span>&nbsp; <span class='diff-add'> var sz = line.text.length + 1;</span>&nbsp; <span class='diff-add'> if (sz > off) { ch = off; return true; }</span>&nbsp; <span class='diff-add'> off -= sz;</span>&nbsp; <span class='diff-add'> ++lineNo;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return clipPos(this, Pos(lineNo, ch));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> indexFromPos: function (coords) {</span>&nbsp; <span class='diff-add'> coords = clipPos(this, coords);</span>&nbsp; <span class='diff-add'> var index = coords.ch;</span>&nbsp; <span class='diff-add'> if (coords.line < this.first || coords.ch < 0) return 0;</span>&nbsp; <span class='diff-add'> this.iter(this.first, coords.line, function (line) {</span>&nbsp; <span class='diff-add'> index += line.text.length + 1;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return index;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> copy: function(copyHistory) {</span>&nbsp; <span class='diff-add'> var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first);</span>&nbsp; <span class='diff-add'> doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;</span>&nbsp; <span class='diff-add'> doc.sel = this.sel;</span>&nbsp; <span class='diff-add'> doc.extend = false;</span>&nbsp; <span class='diff-add'> if (copyHistory) {</span>&nbsp; <span class='diff-add'> doc.history.undoDepth = this.history.undoDepth;</span>&nbsp; <span class='diff-add'> doc.setHistory(this.getHistory());</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return doc;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> linkedDoc: function(options) {</span>&nbsp; <span class='diff-add'> if (!options) options = {};</span>&nbsp; <span class='diff-add'> var from = this.first, to = this.first + this.size;</span>&nbsp; <span class='diff-add'> if (options.from != null && options.from > from) from = options.from;</span>&nbsp; <span class='diff-add'> if (options.to != null && options.to < to) to = options.to;</span>&nbsp; <span class='diff-add'> var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from);</span>&nbsp; <span class='diff-add'> if (options.sharedHist) copy.history = this.history;</span>&nbsp; <span class='diff-add'> (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});</span>&nbsp; <span class='diff-add'> copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];</span>&nbsp; <span class='diff-add'> copySharedMarkers(copy, findSharedMarkers(this));</span>&nbsp; <span class='diff-add'> return copy;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> unlinkDoc: function(other) {</span>&nbsp; <span class='diff-add'> if (other instanceof CodeMirror) other = other.doc;</span>&nbsp; <span class='diff-add'> if (this.linked) for (var i = 0; i < this.linked.length; ++i) {</span>&nbsp; <span class='diff-add'> var link = this.linked[i];</span>&nbsp; <span class='diff-add'> if (link.doc != other) continue;</span>&nbsp; <span class='diff-add'> this.linked.splice(i, 1);</span>&nbsp; <span class='diff-add'> other.unlinkDoc(this);</span>&nbsp; <span class='diff-add'> detachSharedMarkers(findSharedMarkers(this));</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // If the histories were shared, split them again</span>&nbsp; <span class='diff-add'> if (other.history == this.history) {</span>&nbsp; <span class='diff-add'> var splitIds = [other.id];</span>&nbsp; <span class='diff-add'> linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);</span>&nbsp; <span class='diff-add'> other.history = new History(null);</span>&nbsp; <span class='diff-add'> other.history.done = copyHistoryArray(this.history.done, splitIds);</span>&nbsp; <span class='diff-add'> other.history.undone = copyHistoryArray(this.history.undone, splitIds);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> iterLinkedDocs: function(f) {linkedDocs(this, f);},</span>&nbsp; <span class='diff-add'> getMode: function() {return this.mode;},</span>&nbsp; <span class='diff-add'> getEditor: function() {return this.cm;}</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Public alias.</span>&nbsp; <span class='diff-add'> Doc.prototype.eachLine = Doc.prototype.iter;</span>&nbsp; <span class='diff-add'> // Set up methods on CodeMirror's prototype to redirect to the editor's document.</span>&nbsp; <span class='diff-add'> var dontDelegate = "iter insert remove copy getEditor".split(" ");</span>&nbsp; <span class='diff-add'> for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)</span>&nbsp; <span class='diff-add'> CodeMirror.prototype[prop] = (function(method) {</span>&nbsp; <span class='diff-add'> return function() {return method.apply(this.doc, arguments);};</span>&nbsp; <span class='diff-add'> })(Doc.prototype[prop]);</span>&nbsp; <span class='diff-add'> eventMixin(Doc);</span>&nbsp; <span class='diff-add'> // Call f for all linked documents.</span>&nbsp; <span class='diff-add'> function linkedDocs(doc, f, sharedHistOnly) {</span>&nbsp; <span class='diff-add'> function propagate(doc, skip, sharedHist) {</span>&nbsp; <span class='diff-add'> if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {</span>&nbsp; <span class='diff-add'> var rel = doc.linked[i];</span>&nbsp; <span class='diff-add'> if (rel.doc == skip) continue;</span>&nbsp; <span class='diff-add'> var shared = sharedHist && rel.sharedHist;</span>&nbsp; <span class='diff-add'> if (sharedHistOnly && !shared) continue;</span>&nbsp; <span class='diff-add'> f(rel.doc, shared);</span>&nbsp; <span class='diff-add'> propagate(rel.doc, doc, shared);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> propagate(doc, null, true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Attach a document to an editor.</span>&nbsp; <span class='diff-add'> function attachDoc(cm, doc) {</span>&nbsp; <span class='diff-add'> if (doc.cm) throw new Error("This document is already in use.");</span>&nbsp; <span class='diff-add'> cm.doc = doc;</span>&nbsp; <span class='diff-add'> doc.cm = cm;</span>&nbsp; <span class='diff-add'> estimateLineHeights(cm);</span>&nbsp; <span class='diff-add'> loadMode(cm);</span>&nbsp; <span class='diff-add'> if (!cm.options.lineWrapping) findMaxLine(cm);</span>&nbsp; <span class='diff-add'> cm.options.mode = doc.modeOption;</span>&nbsp; <span class='diff-add'> regChange(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // LINE UTILITIES</span>&nbsp; <span class='diff-add'> // Find the line object corresponding to the given line number.</span>&nbsp; <span class='diff-add'> function getLine(doc, n) {</span>&nbsp; <span class='diff-add'> n -= doc.first;</span>&nbsp; <span class='diff-add'> if (n < 0 || n >= doc.size) throw new Error("There is no line " + (n + doc.first) + " in the document.");</span>&nbsp; <span class='diff-add'> for (var chunk = doc; !chunk.lines;) {</span>&nbsp; <span class='diff-add'> for (var i = 0;; ++i) {</span>&nbsp; <span class='diff-add'> var child = chunk.children[i], sz = child.chunkSize();</span>&nbsp; <span class='diff-add'> if (n < sz) { chunk = child; break; }</span>&nbsp; <span class='diff-add'> n -= sz;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return chunk.lines[n];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Get the part of a document between two positions, as an array of</span>&nbsp; <span class='diff-add'> // strings.</span>&nbsp; <span class='diff-add'> function getBetween(doc, start, end) {</span>&nbsp; <span class='diff-add'> var out = [], n = start.line;</span>&nbsp; <span class='diff-add'> doc.iter(start.line, end.line + 1, function(line) {</span>&nbsp; <span class='diff-add'> var text = line.text;</span>&nbsp; <span class='diff-add'> if (n == end.line) text = text.slice(0, end.ch);</span>&nbsp; <span class='diff-add'> if (n == start.line) text = text.slice(start.ch);</span>&nbsp; <span class='diff-add'> out.push(text);</span>&nbsp; <span class='diff-add'> ++n;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return out;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Get the lines between from and to, as array of strings.</span>&nbsp; <span class='diff-add'> function getLines(doc, from, to) {</span>&nbsp; <span class='diff-add'> var out = [];</span>&nbsp; <span class='diff-add'> doc.iter(from, to, function(line) { out.push(line.text); });</span>&nbsp; <span class='diff-add'> return out;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Update the height of a line, propagating the height change</span>&nbsp; <span class='diff-add'> // upwards to parent nodes.</span>&nbsp; <span class='diff-add'> function updateLineHeight(line, height) {</span>&nbsp; <span class='diff-add'> var diff = height - line.height;</span>&nbsp; <span class='diff-add'> if (diff) for (var n = line; n; n = n.parent) n.height += diff;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Given a line object, find its line number by walking up through</span>&nbsp; <span class='diff-add'> // its parent links.</span>&nbsp; <span class='diff-add'> function lineNo(line) {</span>&nbsp; <span class='diff-add'> if (line.parent == null) return null;</span>&nbsp; <span class='diff-add'> var cur = line.parent, no = indexOf(cur.lines, line);</span>&nbsp; <span class='diff-add'> for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {</span>&nbsp; <span class='diff-add'> for (var i = 0;; ++i) {</span>&nbsp; <span class='diff-add'> if (chunk.children[i] == cur) break;</span>&nbsp; <span class='diff-add'> no += chunk.children[i].chunkSize();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return no + cur.first;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Find the line at the given vertical position, using the height</span>&nbsp; <span class='diff-add'> // information in the document tree.</span>&nbsp; <span class='diff-add'> function lineAtHeight(chunk, h) {</span>&nbsp; <span class='diff-add'> var n = chunk.first;</span>&nbsp; <span class='diff-add'> outer: do {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < chunk.children.length; ++i) {</span>&nbsp; <span class='diff-add'> var child = chunk.children[i], ch = child.height;</span>&nbsp; <span class='diff-add'> if (h < ch) { chunk = child; continue outer; }</span>&nbsp; <span class='diff-add'> h -= ch;</span>&nbsp; <span class='diff-add'> n += child.chunkSize();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return n;</span>&nbsp; <span class='diff-add'> } while (!chunk.lines);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < chunk.lines.length; ++i) {</span>&nbsp; <span class='diff-add'> var line = chunk.lines[i], lh = line.height;</span>&nbsp; <span class='diff-add'> if (h < lh) break;</span>&nbsp; <span class='diff-add'> h -= lh;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return n + i;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Find the height above the given line.</span>&nbsp; <span class='diff-add'> function heightAtLine(lineObj) {</span>&nbsp; <span class='diff-add'> lineObj = visualLine(lineObj);</span>&nbsp; <span class='diff-add'> var h = 0, chunk = lineObj.parent;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < chunk.lines.length; ++i) {</span>&nbsp; <span class='diff-add'> var line = chunk.lines[i];</span>&nbsp; <span class='diff-add'> if (line == lineObj) break;</span>&nbsp; <span class='diff-add'> else h += line.height;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < p.children.length; ++i) {</span>&nbsp; <span class='diff-add'> var cur = p.children[i];</span>&nbsp; <span class='diff-add'> if (cur == chunk) break;</span>&nbsp; <span class='diff-add'> else h += cur.height;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return h;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Get the bidi ordering for the given line (and cache it). Returns</span>&nbsp; <span class='diff-add'> // false for lines that are fully left-to-right, and an array of</span>&nbsp; <span class='diff-add'> // BidiSpan objects otherwise.</span>&nbsp; <span class='diff-add'> function getOrder(line) {</span>&nbsp; <span class='diff-add'> var order = line.order;</span>&nbsp; <span class='diff-add'> if (order == null) order = line.order = bidiOrdering(line.text);</span>&nbsp; <span class='diff-add'> return order;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // HISTORY</span>&nbsp; <span class='diff-add'> function History(startGen) {</span>&nbsp; <span class='diff-add'> // Arrays of change events and selections. Doing something adds an</span>&nbsp; <span class='diff-add'> // event to done and clears undo. Undoing moves events from done</span>&nbsp; <span class='diff-add'> // to undone, redoing moves them in the other direction.</span>&nbsp; <span class='diff-add'> this.done = []; this.undone = [];</span>&nbsp; <span class='diff-add'> this.undoDepth = Infinity;</span>&nbsp; <span class='diff-add'> // Used to track when changes can be merged into a single undo</span>&nbsp; <span class='diff-add'> // event</span>&nbsp; <span class='diff-add'> this.lastModTime = this.lastSelTime = 0;</span>&nbsp; <span class='diff-add'> this.lastOp = this.lastSelOp = null;</span>&nbsp; <span class='diff-add'> this.lastOrigin = this.lastSelOrigin = null;</span>&nbsp; <span class='diff-add'> // Used by the isClean() method</span>&nbsp; <span class='diff-add'> this.generation = this.maxGeneration = startGen || 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Create a history change event from an updateDoc-style change</span>&nbsp; <span class='diff-add'> // object.</span>&nbsp; <span class='diff-add'> function historyChangeFromChange(doc, change) {</span>&nbsp; <span class='diff-add'> var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};</span>&nbsp; <span class='diff-add'> attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);</span>&nbsp; <span class='diff-add'> linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);</span>&nbsp; <span class='diff-add'> return histChange;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Pop all selection events off the end of a history array. Stop at</span>&nbsp; <span class='diff-add'> // a change event.</span>&nbsp; <span class='diff-add'> function clearSelectionEvents(array) {</span>&nbsp; <span class='diff-add'> while (array.length) {</span>&nbsp; <span class='diff-add'> var last = lst(array);</span>&nbsp; <span class='diff-add'> if (last.ranges) array.pop();</span>&nbsp; <span class='diff-add'> else break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Find the top change event in the history. Pop off selection</span>&nbsp; <span class='diff-add'> // events that are in the way.</span>&nbsp; <span class='diff-add'> function lastChangeEvent(hist, force) {</span>&nbsp; <span class='diff-add'> if (force) {</span>&nbsp; <span class='diff-add'> clearSelectionEvents(hist.done);</span>&nbsp; <span class='diff-add'> return lst(hist.done);</span>&nbsp; <span class='diff-add'> } else if (hist.done.length && !lst(hist.done).ranges) {</span>&nbsp; <span class='diff-add'> return lst(hist.done);</span>&nbsp; <span class='diff-add'> } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {</span>&nbsp; <span class='diff-add'> hist.done.pop();</span>&nbsp; <span class='diff-add'> return lst(hist.done);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Register a change in the history. Merges changes that are within</span>&nbsp; <span class='diff-add'> // a single operation, ore are close together with an origin that</span>&nbsp; <span class='diff-add'> // allows merging (starting with "+") into a single event.</span>&nbsp; <span class='diff-add'> function addChangeToHistory(doc, change, selAfter, opId) {</span>&nbsp; <span class='diff-add'> var hist = doc.history;</span>&nbsp; <span class='diff-add'> hist.undone.length = 0;</span>&nbsp; <span class='diff-add'> var time = +new Date, cur;</span>&nbsp; <span class='diff-add'> if ((hist.lastOp == opId ||</span>&nbsp; <span class='diff-add'> hist.lastOrigin == change.origin && change.origin &&</span>&nbsp; <span class='diff-add'> ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||</span>&nbsp; <span class='diff-add'> change.origin.charAt(0) == "*")) &&</span>&nbsp; <span class='diff-add'> (cur = lastChangeEvent(hist, hist.lastOp == opId))) {</span>&nbsp; <span class='diff-add'> // Merge this change into the last event</span>&nbsp; <span class='diff-add'> var last = lst(cur.changes);</span>&nbsp; <span class='diff-add'> if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {</span>&nbsp; <span class='diff-add'> // Optimized case for simple insertion -- don't want to add</span>&nbsp; <span class='diff-add'> // new changesets for every character typed</span>&nbsp; <span class='diff-add'> last.to = changeEnd(change);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // Add new sub-event</span>&nbsp; <span class='diff-add'> cur.changes.push(historyChangeFromChange(doc, change));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // Can not be merged, start a new event.</span>&nbsp; <span class='diff-add'> var before = lst(hist.done);</span>&nbsp; <span class='diff-add'> if (!before || !before.ranges)</span>&nbsp; <span class='diff-add'> pushSelectionToHistory(doc.sel, hist.done);</span>&nbsp; <span class='diff-add'> cur = {changes: [historyChangeFromChange(doc, change)],</span>&nbsp; <span class='diff-add'> generation: hist.generation};</span>&nbsp; <span class='diff-add'> hist.done.push(cur);</span>&nbsp; <span class='diff-add'> while (hist.done.length > hist.undoDepth) {</span>&nbsp; <span class='diff-add'> hist.done.shift();</span>&nbsp; <span class='diff-add'> if (!hist.done[0].ranges) hist.done.shift();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> hist.done.push(selAfter);</span>&nbsp; <span class='diff-add'> hist.generation = ++hist.maxGeneration;</span>&nbsp; <span class='diff-add'> hist.lastModTime = hist.lastSelTime = time;</span>&nbsp; <span class='diff-add'> hist.lastOp = hist.lastSelOp = opId;</span>&nbsp; <span class='diff-add'> hist.lastOrigin = hist.lastSelOrigin = change.origin;</span>&nbsp; <span class='diff-add'> if (!last) signal(doc, "historyAdded");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function selectionEventCanBeMerged(doc, origin, prev, sel) {</span>&nbsp; <span class='diff-add'> var ch = origin.charAt(0);</span>&nbsp; <span class='diff-add'> return ch == "*" ||</span>&nbsp; <span class='diff-add'> ch == "+" &&</span>&nbsp; <span class='diff-add'> prev.ranges.length == sel.ranges.length &&</span>&nbsp; <span class='diff-add'> prev.somethingSelected() == sel.somethingSelected() &&</span>&nbsp; <span class='diff-add'> new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Called whenever the selection changes, sets the new selection as</span>&nbsp; <span class='diff-add'> // the pending selection in the history, and pushes the old pending</span>&nbsp; <span class='diff-add'> // selection into the 'done' array when it was significantly</span>&nbsp; <span class='diff-add'> // different (in number of selected ranges, emptiness, or time).</span>&nbsp; <span class='diff-add'> function addSelectionToHistory(doc, sel, opId, options) {</span>&nbsp; <span class='diff-add'> var hist = doc.history, origin = options && options.origin;</span>&nbsp; <span class='diff-add'> // A new event is started when the previous origin does not match</span>&nbsp; <span class='diff-add'> // the current, or the origins don't allow matching. Origins</span>&nbsp; <span class='diff-add'> // starting with * are always merged, those starting with + are</span>&nbsp; <span class='diff-add'> // merged when similar and close together in time.</span>&nbsp; <span class='diff-add'> if (opId == hist.lastSelOp ||</span>&nbsp; <span class='diff-add'> (origin && hist.lastSelOrigin == origin &&</span>&nbsp; <span class='diff-add'> (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||</span>&nbsp; <span class='diff-add'> selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))</span>&nbsp; <span class='diff-add'> hist.done[hist.done.length - 1] = sel;</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> pushSelectionToHistory(sel, hist.done);</span>&nbsp; <span class='diff-add'> hist.lastSelTime = +new Date;</span>&nbsp; <span class='diff-add'> hist.lastSelOrigin = origin;</span>&nbsp; <span class='diff-add'> hist.lastSelOp = opId;</span>&nbsp; <span class='diff-add'> if (options && options.clearRedo !== false)</span>&nbsp; <span class='diff-add'> clearSelectionEvents(hist.undone);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function pushSelectionToHistory(sel, dest) {</span>&nbsp; <span class='diff-add'> var top = lst(dest);</span>&nbsp; <span class='diff-add'> if (!(top && top.ranges && top.equals(sel)))</span>&nbsp; <span class='diff-add'> dest.push(sel);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Used to store marked span information in the history.</span>&nbsp; <span class='diff-add'> function attachLocalSpans(doc, change, from, to) {</span>&nbsp; <span class='diff-add'> var existing = change["spans_" + doc.id], n = 0;</span>&nbsp; <span class='diff-add'> doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {</span>&nbsp; <span class='diff-add'> if (line.markedSpans)</span>&nbsp; <span class='diff-add'> (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans;</span>&nbsp; <span class='diff-add'> ++n;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // When un/re-doing restores text containing marked spans, those</span>&nbsp; <span class='diff-add'> // that have been explicitly cleared should not be restored.</span>&nbsp; <span class='diff-add'> function removeClearedSpans(spans) {</span>&nbsp; <span class='diff-add'> if (!spans) return null;</span>&nbsp; <span class='diff-add'> for (var i = 0, out; i < spans.length; ++i) {</span>&nbsp; <span class='diff-add'> if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }</span>&nbsp; <span class='diff-add'> else if (out) out.push(spans[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return !out ? spans : out.length ? out : null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Retrieve and filter the old marked spans stored in a change event.</span>&nbsp; <span class='diff-add'> function getOldSpans(doc, change) {</span>&nbsp; <span class='diff-add'> var found = change["spans_" + doc.id];</span>&nbsp; <span class='diff-add'> if (!found) return null;</span>&nbsp; <span class='diff-add'> for (var i = 0, nw = []; i < change.text.length; ++i)</span>&nbsp; <span class='diff-add'> nw.push(removeClearedSpans(found[i]));</span>&nbsp; <span class='diff-add'> return nw;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Used both to provide a JSON-safe object in .getHistory, and, when</span>&nbsp; <span class='diff-add'> // detaching a document, to split the history in two</span>&nbsp; <span class='diff-add'> function copyHistoryArray(events, newGroup, instantiateSel) {</span>&nbsp; <span class='diff-add'> for (var i = 0, copy = []; i < events.length; ++i) {</span>&nbsp; <span class='diff-add'> var event = events[i];</span>&nbsp; <span class='diff-add'> if (event.ranges) {</span>&nbsp; <span class='diff-add'> copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var changes = event.changes, newChanges = [];</span>&nbsp; <span class='diff-add'> copy.push({changes: newChanges});</span>&nbsp; <span class='diff-add'> for (var j = 0; j < changes.length; ++j) {</span>&nbsp; <span class='diff-add'> var change = changes[j], m;</span>&nbsp; <span class='diff-add'> newChanges.push({from: change.from, to: change.to, text: change.text});</span>&nbsp; <span class='diff-add'> if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) {</span>&nbsp; <span class='diff-add'> if (indexOf(newGroup, Number(m[1])) > -1) {</span>&nbsp; <span class='diff-add'> lst(newChanges)[prop] = change[prop];</span>&nbsp; <span class='diff-add'> delete change[prop];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return copy;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Rebasing/resetting history to deal with externally-sourced changes</span>&nbsp; <span class='diff-add'> function rebaseHistSelSingle(pos, from, to, diff) {</span>&nbsp; <span class='diff-add'> if (to < pos.line) {</span>&nbsp; <span class='diff-add'> pos.line += diff;</span>&nbsp; <span class='diff-add'> } else if (from < pos.line) {</span>&nbsp; <span class='diff-add'> pos.line = from;</span>&nbsp; <span class='diff-add'> pos.ch = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Tries to rebase an array of history events given a change in the</span>&nbsp; <span class='diff-add'> // document. If the change touches the same lines as the event, the</span>&nbsp; <span class='diff-add'> // event, and everything 'behind' it, is discarded. If the change is</span>&nbsp; <span class='diff-add'> // before the event, the event's positions are updated. Uses a</span>&nbsp; <span class='diff-add'> // copy-on-write scheme for the positions, to avoid having to</span>&nbsp; <span class='diff-add'> // reallocate them all on every rebase, but also avoid problems with</span>&nbsp; <span class='diff-add'> // shared position objects being unsafely updated.</span>&nbsp; <span class='diff-add'> function rebaseHistArray(array, from, to, diff) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < array.length; ++i) {</span>&nbsp; <span class='diff-add'> var sub = array[i], ok = true;</span>&nbsp; <span class='diff-add'> if (sub.ranges) {</span>&nbsp; <span class='diff-add'> if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }</span>&nbsp; <span class='diff-add'> for (var j = 0; j < sub.ranges.length; j++) {</span>&nbsp; <span class='diff-add'> rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);</span>&nbsp; <span class='diff-add'> rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (var j = 0; j < sub.changes.length; ++j) {</span>&nbsp; <span class='diff-add'> var cur = sub.changes[j];</span>&nbsp; <span class='diff-add'> if (to < cur.from.line) {</span>&nbsp; <span class='diff-add'> cur.from = Pos(cur.from.line + diff, cur.from.ch);</span>&nbsp; <span class='diff-add'> cur.to = Pos(cur.to.line + diff, cur.to.ch);</span>&nbsp; <span class='diff-add'> } else if (from <= cur.to.line) {</span>&nbsp; <span class='diff-add'> ok = false;</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!ok) {</span>&nbsp; <span class='diff-add'> array.splice(0, i + 1);</span>&nbsp; <span class='diff-add'> i = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function rebaseHist(hist, change) {</span>&nbsp; <span class='diff-add'> var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;</span>&nbsp; <span class='diff-add'> rebaseHistArray(hist.done, from, to, diff);</span>&nbsp; <span class='diff-add'> rebaseHistArray(hist.undone, from, to, diff);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // EVENT UTILITIES</span>&nbsp; <span class='diff-add'> // Due to the fact that we still support jurassic IE versions, some</span>&nbsp; <span class='diff-add'> // compatibility wrappers are needed.</span>&nbsp; <span class='diff-add'> var e_preventDefault = CodeMirror.e_preventDefault = function(e) {</span>&nbsp; <span class='diff-add'> if (e.preventDefault) e.preventDefault();</span>&nbsp; <span class='diff-add'> else e.returnValue = false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {</span>&nbsp; <span class='diff-add'> if (e.stopPropagation) e.stopPropagation();</span>&nbsp; <span class='diff-add'> else e.cancelBubble = true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function e_defaultPrevented(e) {</span>&nbsp; <span class='diff-add'> return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};</span>&nbsp; <span class='diff-add'> function e_target(e) {return e.target || e.srcElement;}</span>&nbsp; <span class='diff-add'> function e_button(e) {</span>&nbsp; <span class='diff-add'> var b = e.which;</span>&nbsp; <span class='diff-add'> if (b == null) {</span>&nbsp; <span class='diff-add'> if (e.button & 1) b = 1;</span>&nbsp; <span class='diff-add'> else if (e.button & 2) b = 3;</span>&nbsp; <span class='diff-add'> else if (e.button & 4) b = 2;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (mac && e.ctrlKey && b == 1) b = 3;</span>&nbsp; <span class='diff-add'> return b;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // EVENT HANDLING</span>&nbsp; <span class='diff-add'> // Lightweight event framework. on/off also work on DOM nodes,</span>&nbsp; <span class='diff-add'> // registering native DOM handlers.</span>&nbsp; <span class='diff-add'> var on = CodeMirror.on = function(emitter, type, f) {</span>&nbsp; <span class='diff-add'> if (emitter.addEventListener)</span>&nbsp; <span class='diff-add'> emitter.addEventListener(type, f, false);</span>&nbsp; <span class='diff-add'> else if (emitter.attachEvent)</span>&nbsp; <span class='diff-add'> emitter.attachEvent("on" + type, f);</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> var map = emitter._handlers || (emitter._handlers = {});</span>&nbsp; <span class='diff-add'> var arr = map[type] || (map[type] = []);</span>&nbsp; <span class='diff-add'> arr.push(f);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var off = CodeMirror.off = function(emitter, type, f) {</span>&nbsp; <span class='diff-add'> if (emitter.removeEventListener)</span>&nbsp; <span class='diff-add'> emitter.removeEventListener(type, f, false);</span>&nbsp; <span class='diff-add'> else if (emitter.detachEvent)</span>&nbsp; <span class='diff-add'> emitter.detachEvent("on" + type, f);</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> var arr = emitter._handlers && emitter._handlers[type];</span>&nbsp; <span class='diff-add'> if (!arr) return;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < arr.length; ++i)</span>&nbsp; <span class='diff-add'> if (arr[i] == f) { arr.splice(i, 1); break; }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {</span>&nbsp; <span class='diff-add'> var arr = emitter._handlers && emitter._handlers[type];</span>&nbsp; <span class='diff-add'> if (!arr) return;</span>&nbsp; <span class='diff-add'> var args = Array.prototype.slice.call(arguments, 2);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var orphanDelayedCallbacks = null;</span>&nbsp; <span class='diff-add'> // Often, we want to signal events at a point where we are in the</span>&nbsp; <span class='diff-add'> // middle of some work, but don't want the handler to start calling</span>&nbsp; <span class='diff-add'> // other methods on the editor, which might be in an inconsistent</span>&nbsp; <span class='diff-add'> // state or simply not expect any other events to happen.</span>&nbsp; <span class='diff-add'> // signalLater looks whether there are any handlers, and schedules</span>&nbsp; <span class='diff-add'> // them to be executed when the last operation ends, or, if no</span>&nbsp; <span class='diff-add'> // operation is active, when a timeout fires.</span>&nbsp; <span class='diff-add'> function signalLater(emitter, type /*, values...*/) {</span>&nbsp; <span class='diff-add'> var arr = emitter._handlers && emitter._handlers[type];</span>&nbsp; <span class='diff-add'> if (!arr) return;</span>&nbsp; <span class='diff-add'> var args = Array.prototype.slice.call(arguments, 2), list;</span>&nbsp; <span class='diff-add'> if (operationGroup) {</span>&nbsp; <span class='diff-add'> list = operationGroup.delayedCallbacks;</span>&nbsp; <span class='diff-add'> } else if (orphanDelayedCallbacks) {</span>&nbsp; <span class='diff-add'> list = orphanDelayedCallbacks;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> list = orphanDelayedCallbacks = [];</span>&nbsp; <span class='diff-add'> setTimeout(fireOrphanDelayed, 0);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function bnd(f) {return function(){f.apply(null, args);};};</span>&nbsp; <span class='diff-add'> for (var i = 0; i < arr.length; ++i)</span>&nbsp; <span class='diff-add'> list.push(bnd(arr[i]));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function fireOrphanDelayed() {</span>&nbsp; <span class='diff-add'> var delayed = orphanDelayedCallbacks;</span>&nbsp; <span class='diff-add'> orphanDelayedCallbacks = null;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < delayed.length; ++i) delayed[i]();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // The DOM events that CodeMirror handles can be overridden by</span>&nbsp; <span class='diff-add'> // registering a (non-DOM) handler on the editor for the event name,</span>&nbsp; <span class='diff-add'> // and preventDefault-ing the event in that handler.</span>&nbsp; <span class='diff-add'> function signalDOMEvent(cm, e, override) {</span>&nbsp; <span class='diff-add'> if (typeof e == "string")</span>&nbsp; <span class='diff-add'> e = {type: e, preventDefault: function() { this.defaultPrevented = true; }};</span>&nbsp; <span class='diff-add'> signal(cm, override || e.type, cm, e);</span>&nbsp; <span class='diff-add'> return e_defaultPrevented(e) || e.codemirrorIgnore;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function signalCursorActivity(cm) {</span>&nbsp; <span class='diff-add'> var arr = cm._handlers && cm._handlers.cursorActivity;</span>&nbsp; <span class='diff-add'> if (!arr) return;</span>&nbsp; <span class='diff-add'> var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)</span>&nbsp; <span class='diff-add'> set.push(arr[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function hasHandler(emitter, type) {</span>&nbsp; <span class='diff-add'> var arr = emitter._handlers && emitter._handlers[type];</span>&nbsp; <span class='diff-add'> return arr && arr.length > 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Add on and off methods to a constructor's prototype, to make</span>&nbsp; <span class='diff-add'> // registering events on such objects more convenient.</span>&nbsp; <span class='diff-add'> function eventMixin(ctor) {</span>&nbsp; <span class='diff-add'> ctor.prototype.on = function(type, f) {on(this, type, f);};</span>&nbsp; <span class='diff-add'> ctor.prototype.off = function(type, f) {off(this, type, f);};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // MISC UTILITIES</span>&nbsp; <span class='diff-add'> // Number of pixels added to scroller and sizer to hide scrollbar</span>&nbsp; <span class='diff-add'> var scrollerGap = 30;</span>&nbsp; <span class='diff-add'> // Returned or thrown by various protocols to signal 'I'm not</span>&nbsp; <span class='diff-add'> // handling this'.</span>&nbsp; <span class='diff-add'> var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};</span>&nbsp; <span class='diff-add'> // Reused option objects for setSelection & friends</span>&nbsp; <span class='diff-add'> var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};</span>&nbsp; <span class='diff-add'> function Delayed() {this.id = null;}</span>&nbsp; <span class='diff-add'> Delayed.prototype.set = function(ms, f) {</span>&nbsp; <span class='diff-add'> clearTimeout(this.id);</span>&nbsp; <span class='diff-add'> this.id = setTimeout(f, ms);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Counts the column offset in a string, taking tabs into account.</span>&nbsp; <span class='diff-add'> // Used mostly to find indentation.</span>&nbsp; <span class='diff-add'> var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) {</span>&nbsp; <span class='diff-add'> if (end == null) {</span>&nbsp; <span class='diff-add'> end = string.search(/[^\s\u00a0]/);</span>&nbsp; <span class='diff-add'> if (end == -1) end = string.length;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (var i = startIndex || 0, n = startValue || 0;;) {</span>&nbsp; <span class='diff-add'> var nextTab = string.indexOf("\t", i);</span>&nbsp; <span class='diff-add'> if (nextTab < 0 || nextTab >= end)</span>&nbsp; <span class='diff-add'> return n + (end - i);</span>&nbsp; <span class='diff-add'> n += nextTab - i;</span>&nbsp; <span class='diff-add'> n += tabSize - (n % tabSize);</span>&nbsp; <span class='diff-add'> i = nextTab + 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // The inverse of countColumn -- find the offset that corresponds to</span>&nbsp; <span class='diff-add'> // a particular column.</span>&nbsp; <span class='diff-add'> function findColumn(string, goal, tabSize) {</span>&nbsp; <span class='diff-add'> for (var pos = 0, col = 0;;) {</span>&nbsp; <span class='diff-add'> var nextTab = string.indexOf("\t", pos);</span>&nbsp; <span class='diff-add'> if (nextTab == -1) nextTab = string.length;</span>&nbsp; <span class='diff-add'> var skipped = nextTab - pos;</span>&nbsp; <span class='diff-add'> if (nextTab == string.length || col + skipped >= goal)</span>&nbsp; <span class='diff-add'> return pos + Math.min(skipped, goal - col);</span>&nbsp; <span class='diff-add'> col += nextTab - pos;</span>&nbsp; <span class='diff-add'> col += tabSize - (col % tabSize);</span>&nbsp; <span class='diff-add'> pos = nextTab + 1;</span>&nbsp; <span class='diff-add'> if (col >= goal) return pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var spaceStrs = [""];</span>&nbsp; <span class='diff-add'> function spaceStr(n) {</span>&nbsp; <span class='diff-add'> while (spaceStrs.length <= n)</span>&nbsp; <span class='diff-add'> spaceStrs.push(lst(spaceStrs) + " ");</span>&nbsp; <span class='diff-add'> return spaceStrs[n];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function lst(arr) { return arr[arr.length-1]; }</span>&nbsp; <span class='diff-add'> var selectInput = function(node) { node.select(); };</span>&nbsp; <span class='diff-add'> if (ios) // Mobile Safari apparently has a bug where select() is broken.</span>&nbsp; <span class='diff-add'> selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };</span>&nbsp; <span class='diff-add'> else if (ie) // Suppress mysterious IE10 errors</span>&nbsp; <span class='diff-add'> selectInput = function(node) { try { node.select(); } catch(_e) {} };</span>&nbsp; <span class='diff-add'> function indexOf(array, elt) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < array.length; ++i)</span>&nbsp; <span class='diff-add'> if (array[i] == elt) return i;</span>&nbsp; <span class='diff-add'> return -1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if ([].indexOf) indexOf = function(array, elt) { return array.indexOf(elt); };</span>&nbsp; <span class='diff-add'> function map(array, f) {</span>&nbsp; <span class='diff-add'> var out = [];</span>&nbsp; <span class='diff-add'> for (var i = 0; i < array.length; i++) out[i] = f(array[i], i);</span>&nbsp; <span class='diff-add'> return out;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if ([].map) map = function(array, f) { return array.map(f); };</span>&nbsp; <span class='diff-add'> function createObj(base, props) {</span>&nbsp; <span class='diff-add'> var inst;</span>&nbsp; <span class='diff-add'> if (Object.create) {</span>&nbsp; <span class='diff-add'> inst = Object.create(base);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var ctor = function() {};</span>&nbsp; <span class='diff-add'> ctor.prototype = base;</span>&nbsp; <span class='diff-add'> inst = new ctor();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (props) copyObj(props, inst);</span>&nbsp; <span class='diff-add'> return inst;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function copyObj(obj, target, overwrite) {</span>&nbsp; <span class='diff-add'> if (!target) target = {};</span>&nbsp; <span class='diff-add'> for (var prop in obj)</span>&nbsp; <span class='diff-add'> if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))</span>&nbsp; <span class='diff-add'> target[prop] = obj[prop];</span>&nbsp; <span class='diff-add'> return target;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function bind(f) {</span>&nbsp; <span class='diff-add'> var args = Array.prototype.slice.call(arguments, 1);</span>&nbsp; <span class='diff-add'> return function(){return f.apply(null, args);};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var nonASCIISingleCaseWordChar = /[\u00df\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;</span>&nbsp; <span class='diff-add'> var isWordCharBasic = CodeMirror.isWordChar = function(ch) {</span>&nbsp; <span class='diff-add'> return /\w/.test(ch) || ch > "\x80" &&</span>&nbsp; <span class='diff-add'> (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function isWordChar(ch, helper) {</span>&nbsp; <span class='diff-add'> if (!helper) return isWordCharBasic(ch);</span>&nbsp; <span class='diff-add'> if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) return true;</span>&nbsp; <span class='diff-add'> return helper.test(ch);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function isEmpty(obj) {</span>&nbsp; <span class='diff-add'> for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Extending unicode characters. A series of a non-extending char +</span>&nbsp; <span class='diff-add'> // any number of extending chars is treated as a single unit as far</span>&nbsp; <span class='diff-add'> // as editing and measuring is concerned. This is not fully correct,</span>&nbsp; <span class='diff-add'> // since some scripts/fonts/browsers also treat other configurations</span>&nbsp; <span class='diff-add'> // of code points as a group.</span>&nbsp; <span class='diff-add'> var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;</span>&nbsp; <span class='diff-add'> function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }</span>&nbsp; <span class='diff-add'> // DOM UTILITIES</span>&nbsp; <span class='diff-add'> function elt(tag, content, className, style) {</span>&nbsp; <span class='diff-add'> var e = document.createElement(tag);</span>&nbsp; <span class='diff-add'> if (className) e.className = className;</span>&nbsp; <span class='diff-add'> if (style) e.style.cssText = style;</span>&nbsp; <span class='diff-add'> if (typeof content == "string") e.appendChild(document.createTextNode(content));</span>&nbsp; <span class='diff-add'> else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);</span>&nbsp; <span class='diff-add'> return e;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var range;</span>&nbsp; <span class='diff-add'> if (document.createRange) range = function(node, start, end) {</span>&nbsp; <span class='diff-add'> var r = document.createRange();</span>&nbsp; <span class='diff-add'> r.setEnd(node, end);</span>&nbsp; <span class='diff-add'> r.setStart(node, start);</span>&nbsp; <span class='diff-add'> return r;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> else range = function(node, start, end) {</span>&nbsp; <span class='diff-add'> var r = document.body.createTextRange();</span>&nbsp; <span class='diff-add'> try { r.moveToElementText(node.parentNode); }</span>&nbsp; <span class='diff-add'> catch(e) { return r; }</span>&nbsp; <span class='diff-add'> r.collapse(true);</span>&nbsp; <span class='diff-add'> r.moveEnd("character", end);</span>&nbsp; <span class='diff-add'> r.moveStart("character", start);</span>&nbsp; <span class='diff-add'> return r;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function removeChildren(e) {</span>&nbsp; <span class='diff-add'> for (var count = e.childNodes.length; count > 0; --count)</span>&nbsp; <span class='diff-add'> e.removeChild(e.firstChild);</span>&nbsp; <span class='diff-add'> return e;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function removeChildrenAndAdd(parent, e) {</span>&nbsp; <span class='diff-add'> return removeChildren(parent).appendChild(e);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function contains(parent, child) {</span>&nbsp; <span class='diff-add'> if (parent.contains)</span>&nbsp; <span class='diff-add'> return parent.contains(child);</span>&nbsp; <span class='diff-add'> while (child = child.parentNode)</span>&nbsp; <span class='diff-add'> if (child == parent) return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function activeElt() { return document.activeElement; }</span>&nbsp; <span class='diff-add'> // Older versions of IE throws unspecified error when touching</span>&nbsp; <span class='diff-add'> // document.activeElement in some cases (during loading, in iframe)</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 11) activeElt = function() {</span>&nbsp; <span class='diff-add'> try { return document.activeElement; }</span>&nbsp; <span class='diff-add'> catch(e) { return document.body; }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); }</span>&nbsp; <span class='diff-add'> var rmClass = CodeMirror.rmClass = function(node, cls) {</span>&nbsp; <span class='diff-add'> var current = node.className;</span>&nbsp; <span class='diff-add'> var match = classTest(cls).exec(current);</span>&nbsp; <span class='diff-add'> if (match) {</span>&nbsp; <span class='diff-add'> var after = current.slice(match.index + match[0].length);</span>&nbsp; <span class='diff-add'> node.className = current.slice(0, match.index) + (after ? match[1] + after : "");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var addClass = CodeMirror.addClass = function(node, cls) {</span>&nbsp; <span class='diff-add'> var current = node.className;</span>&nbsp; <span class='diff-add'> if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function joinClasses(a, b) {</span>&nbsp; <span class='diff-add'> var as = a.split(" ");</span>&nbsp; <span class='diff-add'> for (var i = 0; i < as.length; i++)</span>&nbsp; <span class='diff-add'> if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i];</span>&nbsp; <span class='diff-add'> return b;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // WINDOW-WIDE EVENTS</span>&nbsp; <span class='diff-add'> // These must be handled carefully, because naively registering a</span>&nbsp; <span class='diff-add'> // handler for each editor will cause the editors to never be</span>&nbsp; <span class='diff-add'> // garbage collected.</span>&nbsp; <span class='diff-add'> function forEachCodeMirror(f) {</span>&nbsp; <span class='diff-add'> if (!document.body.getElementsByClassName) return;</span>&nbsp; <span class='diff-add'> var byClass = document.body.getElementsByClassName("CodeMirror");</span>&nbsp; <span class='diff-add'> for (var i = 0; i < byClass.length; i++) {</span>&nbsp; <span class='diff-add'> var cm = byClass[i].CodeMirror;</span>&nbsp; <span class='diff-add'> if (cm) f(cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var globalsRegistered = false;</span>&nbsp; <span class='diff-add'> function ensureGlobalHandlers() {</span>&nbsp; <span class='diff-add'> if (globalsRegistered) return;</span>&nbsp; <span class='diff-add'> registerGlobalHandlers();</span>&nbsp; <span class='diff-add'> globalsRegistered = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function registerGlobalHandlers() {</span>&nbsp; <span class='diff-add'> // When the window resizes, we need to refresh active editors.</span>&nbsp; <span class='diff-add'> var resizeTimer;</span>&nbsp; <span class='diff-add'> on(window, "resize", function() {</span>&nbsp; <span class='diff-add'> if (resizeTimer == null) resizeTimer = setTimeout(function() {</span>&nbsp; <span class='diff-add'> resizeTimer = null;</span>&nbsp; <span class='diff-add'> forEachCodeMirror(onResize);</span>&nbsp; <span class='diff-add'> }, 100);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // When the window loses focus, we want to show the editor as blurred</span>&nbsp; <span class='diff-add'> on(window, "blur", function() {</span>&nbsp; <span class='diff-add'> forEachCodeMirror(onBlur);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // FEATURE DETECTION</span>&nbsp; <span class='diff-add'> // Detect drag-and-drop</span>&nbsp; <span class='diff-add'> var dragAndDrop = function() {</span>&nbsp; <span class='diff-add'> // There is *some* kind of drag-and-drop support in IE6-8, but I</span>&nbsp; <span class='diff-add'> // couldn't get it to work yet.</span>&nbsp; <span class='diff-add'> if (ie && ie_version < 9) return false;</span>&nbsp; <span class='diff-add'> var div = elt('div');</span>&nbsp; <span class='diff-add'> return "draggable" in div || "dragDrop" in div;</span>&nbsp; <span class='diff-add'> }();</span>&nbsp; <span class='diff-add'> var zwspSupported;</span>&nbsp; <span class='diff-add'> function zeroWidthElement(measure) {</span>&nbsp; <span class='diff-add'> if (zwspSupported == null) {</span>&nbsp; <span class='diff-add'> var test = elt("span", "\u200b");</span>&nbsp; <span class='diff-add'> removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));</span>&nbsp; <span class='diff-add'> if (measure.firstChild.offsetHeight != 0)</span>&nbsp; <span class='diff-add'> zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (zwspSupported) return elt("span", "\u200b");</span>&nbsp; <span class='diff-add'> else return elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Feature-detect IE's crummy client rect reporting for bidi text</span>&nbsp; <span class='diff-add'> var badBidiRects;</span>&nbsp; <span class='diff-add'> function hasBadBidiRects(measure) {</span>&nbsp; <span class='diff-add'> if (badBidiRects != null) return badBidiRects;</span>&nbsp; <span class='diff-add'> var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));</span>&nbsp; <span class='diff-add'> var r0 = range(txt, 0, 1).getBoundingClientRect();</span>&nbsp; <span class='diff-add'> if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)</span>&nbsp; <span class='diff-add'> var r1 = range(txt, 1, 2).getBoundingClientRect();</span>&nbsp; <span class='diff-add'> return badBidiRects = (r1.right - r0.right < 3);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // See if "".split is the broken IE version, if so, provide an</span>&nbsp; <span class='diff-add'> // alternative way to split lines.</span>&nbsp; <span class='diff-add'> var splitLines = CodeMirror.splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {</span>&nbsp; <span class='diff-add'> var pos = 0, result = [], l = string.length;</span>&nbsp; <span class='diff-add'> while (pos <= l) {</span>&nbsp; <span class='diff-add'> var nl = string.indexOf("\n", pos);</span>&nbsp; <span class='diff-add'> if (nl == -1) nl = string.length;</span>&nbsp; <span class='diff-add'> var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);</span>&nbsp; <span class='diff-add'> var rt = line.indexOf("\r");</span>&nbsp; <span class='diff-add'> if (rt != -1) {</span>&nbsp; <span class='diff-add'> result.push(line.slice(0, rt));</span>&nbsp; <span class='diff-add'> pos += rt + 1;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> result.push(line);</span>&nbsp; <span class='diff-add'> pos = nl + 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> } : function(string){return string.split(/\r\n?|\n/);};</span>&nbsp; <span class='diff-add'> var hasSelection = window.getSelection ? function(te) {</span>&nbsp; <span class='diff-add'> try { return te.selectionStart != te.selectionEnd; }</span>&nbsp; <span class='diff-add'> catch(e) { return false; }</span>&nbsp; <span class='diff-add'> } : function(te) {</span>&nbsp; <span class='diff-add'> try {var range = te.ownerDocument.selection.createRange();}</span>&nbsp; <span class='diff-add'> catch(e) {}</span>&nbsp; <span class='diff-add'> if (!range || range.parentElement() != te) return false;</span>&nbsp; <span class='diff-add'> return range.compareEndPoints("StartToEnd", range) != 0;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var hasCopyEvent = (function() {</span>&nbsp; <span class='diff-add'> var e = elt("div");</span>&nbsp; <span class='diff-add'> if ("oncopy" in e) return true;</span>&nbsp; <span class='diff-add'> e.setAttribute("oncopy", "return;");</span>&nbsp; <span class='diff-add'> return typeof e.oncopy == "function";</span>&nbsp; <span class='diff-add'> })();</span>&nbsp; <span class='diff-add'> var badZoomedRects = null;</span>&nbsp; <span class='diff-add'> function hasBadZoomedRects(measure) {</span>&nbsp; <span class='diff-add'> if (badZoomedRects != null) return badZoomedRects;</span>&nbsp; <span class='diff-add'> var node = removeChildrenAndAdd(measure, elt("span", "x"));</span>&nbsp; <span class='diff-add'> var normal = node.getBoundingClientRect();</span>&nbsp; <span class='diff-add'> var fromRange = range(node, 0, 1).getBoundingClientRect();</span>&nbsp; <span class='diff-add'> return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // KEY NAMES</span>&nbsp; <span class='diff-add'> var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",</span>&nbsp; <span class='diff-add'> 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",</span>&nbsp; <span class='diff-add'> 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",</span>&nbsp; <span class='diff-add'> 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", 107: "=", 109: "-", 127: "Delete",</span>&nbsp; <span class='diff-add'> 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",</span>&nbsp; <span class='diff-add'> 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",</span>&nbsp; <span class='diff-add'> 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"};</span>&nbsp; <span class='diff-add'> CodeMirror.keyNames = keyNames;</span>&nbsp; <span class='diff-add'> (function() {</span>&nbsp; <span class='diff-add'> // Number keys</span>&nbsp; <span class='diff-add'> for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);</span>&nbsp; <span class='diff-add'> // Alphabetic keys</span>&nbsp; <span class='diff-add'> for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);</span>&nbsp; <span class='diff-add'> // Function keys</span>&nbsp; <span class='diff-add'> for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;</span>&nbsp; <span class='diff-add'> })();</span>&nbsp; <span class='diff-add'> // BIDI HELPERS</span>&nbsp; <span class='diff-add'> function iterateBidiSections(order, from, to, f) {</span>&nbsp; <span class='diff-add'> if (!order) return f(from, to, "ltr");</span>&nbsp; <span class='diff-add'> var found = false;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < order.length; ++i) {</span>&nbsp; <span class='diff-add'> var part = order[i];</span>&nbsp; <span class='diff-add'> if (part.from < to && part.to > from || from == to && part.to == from) {</span>&nbsp; <span class='diff-add'> f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr");</span>&nbsp; <span class='diff-add'> found = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!found) f(from, to, "ltr");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }</span>&nbsp; <span class='diff-add'> function bidiRight(part) { return part.level % 2 ? part.from : part.to; }</span>&nbsp; <span class='diff-add'> function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }</span>&nbsp; <span class='diff-add'> function lineRight(line) {</span>&nbsp; <span class='diff-add'> var order = getOrder(line);</span>&nbsp; <span class='diff-add'> if (!order) return line.text.length;</span>&nbsp; <span class='diff-add'> return bidiRight(lst(order));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function lineStart(cm, lineN) {</span>&nbsp; <span class='diff-add'> var line = getLine(cm.doc, lineN);</span>&nbsp; <span class='diff-add'> var visual = visualLine(line);</span>&nbsp; <span class='diff-add'> if (visual != line) lineN = lineNo(visual);</span>&nbsp; <span class='diff-add'> var order = getOrder(visual);</span>&nbsp; <span class='diff-add'> var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);</span>&nbsp; <span class='diff-add'> return Pos(lineN, ch);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function lineEnd(cm, lineN) {</span>&nbsp; <span class='diff-add'> var merged, line = getLine(cm.doc, lineN);</span>&nbsp; <span class='diff-add'> while (merged = collapsedSpanAtEnd(line)) {</span>&nbsp; <span class='diff-add'> line = merged.find(1, true).line;</span>&nbsp; <span class='diff-add'> lineN = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var order = getOrder(line);</span>&nbsp; <span class='diff-add'> var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);</span>&nbsp; <span class='diff-add'> return Pos(lineN == null ? lineNo(line) : lineN, ch);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function lineStartSmart(cm, pos) {</span>&nbsp; <span class='diff-add'> var start = lineStart(cm, pos.line);</span>&nbsp; <span class='diff-add'> var line = getLine(cm.doc, start.line);</span>&nbsp; <span class='diff-add'> var order = getOrder(line);</span>&nbsp; <span class='diff-add'> if (!order || order[0].level == 0) {</span>&nbsp; <span class='diff-add'> var firstNonWS = Math.max(0, line.text.search(/\S/));</span>&nbsp; <span class='diff-add'> var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;</span>&nbsp; <span class='diff-add'> return Pos(start.line, inWS ? 0 : firstNonWS);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return start;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function compareBidiLevel(order, a, b) {</span>&nbsp; <span class='diff-add'> var linedir = order[0].level;</span>&nbsp; <span class='diff-add'> if (a == linedir) return true;</span>&nbsp; <span class='diff-add'> if (b == linedir) return false;</span>&nbsp; <span class='diff-add'> return a < b;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var bidiOther;</span>&nbsp; <span class='diff-add'> function getBidiPartAt(order, pos) {</span>&nbsp; <span class='diff-add'> bidiOther = null;</span>&nbsp; <span class='diff-add'> for (var i = 0, found; i < order.length; ++i) {</span>&nbsp; <span class='diff-add'> var cur = order[i];</span>&nbsp; <span class='diff-add'> if (cur.from < pos && cur.to > pos) return i;</span>&nbsp; <span class='diff-add'> if ((cur.from == pos || cur.to == pos)) {</span>&nbsp; <span class='diff-add'> if (found == null) {</span>&nbsp; <span class='diff-add'> found = i;</span>&nbsp; <span class='diff-add'> } else if (compareBidiLevel(order, cur.level, order[found].level)) {</span>&nbsp; <span class='diff-add'> if (cur.from != cur.to) bidiOther = found;</span>&nbsp; <span class='diff-add'> return i;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> if (cur.from != cur.to) bidiOther = i;</span>&nbsp; <span class='diff-add'> return found;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return found;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function moveInLine(line, pos, dir, byUnit) {</span>&nbsp; <span class='diff-add'> if (!byUnit) return pos + dir;</span>&nbsp; <span class='diff-add'> do pos += dir;</span>&nbsp; <span class='diff-add'> while (pos > 0 && isExtendingChar(line.text.charAt(pos)));</span>&nbsp; <span class='diff-add'> return pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // This is needed in order to move 'visually' through bi-directional</span>&nbsp; <span class='diff-add'> // text -- i.e., pressing left should make the cursor go left, even</span>&nbsp; <span class='diff-add'> // when in RTL text. The tricky part is the 'jumps', where RTL and</span>&nbsp; <span class='diff-add'> // LTR text touch each other. This often requires the cursor offset</span>&nbsp; <span class='diff-add'> // to move more than one unit, in order to visually move one unit.</span>&nbsp; <span class='diff-add'> function moveVisually(line, start, dir, byUnit) {</span>&nbsp; <span class='diff-add'> var bidi = getOrder(line);</span>&nbsp; <span class='diff-add'> if (!bidi) return moveLogically(line, start, dir, byUnit);</span>&nbsp; <span class='diff-add'> var pos = getBidiPartAt(bidi, start), part = bidi[pos];</span>&nbsp; <span class='diff-add'> var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);</span>&nbsp; <span class='diff-add'> for (;;) {</span>&nbsp; <span class='diff-add'> if (target > part.from && target < part.to) return target;</span>&nbsp; <span class='diff-add'> if (target == part.from || target == part.to) {</span>&nbsp; <span class='diff-add'> if (getBidiPartAt(bidi, target) == pos) return target;</span>&nbsp; <span class='diff-add'> part = bidi[pos += dir];</span>&nbsp; <span class='diff-add'> return (dir > 0) == part.level % 2 ? part.to : part.from;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> part = bidi[pos += dir];</span>&nbsp; <span class='diff-add'> if (!part) return null;</span>&nbsp; <span class='diff-add'> if ((dir > 0) == part.level % 2)</span>&nbsp; <span class='diff-add'> target = moveInLine(line, part.to, -1, byUnit);</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> target = moveInLine(line, part.from, 1, byUnit);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function moveLogically(line, start, dir, byUnit) {</span>&nbsp; <span class='diff-add'> var target = start + dir;</span>&nbsp; <span class='diff-add'> if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;</span>&nbsp; <span class='diff-add'> return target < 0 || target > line.text.length ? null : target;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Bidirectional ordering algorithm</span>&nbsp; <span class='diff-add'> // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm</span>&nbsp; <span class='diff-add'> // that this (partially) implements.</span>&nbsp; <span class='diff-add'> // One-char codes used for character types:</span>&nbsp; <span class='diff-add'> // L (L): Left-to-Right</span>&nbsp; <span class='diff-add'> // R (R): Right-to-Left</span>&nbsp; <span class='diff-add'> // r (AL): Right-to-Left Arabic</span>&nbsp; <span class='diff-add'> // 1 (EN): European Number</span>&nbsp; <span class='diff-add'> // + (ES): European Number Separator</span>&nbsp; <span class='diff-add'> // % (ET): European Number Terminator</span>&nbsp; <span class='diff-add'> // n (AN): Arabic Number</span>&nbsp; <span class='diff-add'> // , (CS): Common Number Separator</span>&nbsp; <span class='diff-add'> // m (NSM): Non-Spacing Mark</span>&nbsp; <span class='diff-add'> // b (BN): Boundary Neutral</span>&nbsp; <span class='diff-add'> // s (B): Paragraph Separator</span>&nbsp; <span class='diff-add'> // t (S): Segment Separator</span>&nbsp; <span class='diff-add'> // w (WS): Whitespace</span>&nbsp; <span class='diff-add'> // N (ON): Other Neutrals</span>&nbsp; <span class='diff-add'> // Returns null if characters are ordered as they appear</span>&nbsp; <span class='diff-add'> // (left-to-right), or an array of sections ({from, to, level}</span>&nbsp; <span class='diff-add'> // objects) in the order in which they occur visually.</span>&nbsp; <span class='diff-add'> var bidiOrdering = (function() {</span>&nbsp; <span class='diff-add'> // Character types for codepoints 0 to 0xff</span>&nbsp; <span class='diff-add'> var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";</span>&nbsp; <span class='diff-add'> // Character types for codepoints 0x600 to 0x6ff</span>&nbsp; <span class='diff-add'> var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm";</span>&nbsp; <span class='diff-add'> function charType(code) {</span>&nbsp; <span class='diff-add'> if (code <= 0xf7) return lowTypes.charAt(code);</span>&nbsp; <span class='diff-add'> else if (0x590 <= code && code <= 0x5f4) return "R";</span>&nbsp; <span class='diff-add'> else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600);</span>&nbsp; <span class='diff-add'> else if (0x6ee <= code && code <= 0x8ac) return "r";</span>&nbsp; <span class='diff-add'> else if (0x2000 <= code && code <= 0x200b) return "w";</span>&nbsp; <span class='diff-add'> else if (code == 0x200c) return "b";</span>&nbsp; <span class='diff-add'> else return "L";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;</span>&nbsp; <span class='diff-add'> var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;</span>&nbsp; <span class='diff-add'> // Browsers seem to always treat the boundaries of block elements as being L.</span>&nbsp; <span class='diff-add'> var outerType = "L";</span>&nbsp; <span class='diff-add'> function BidiSpan(level, from, to) {</span>&nbsp; <span class='diff-add'> this.level = level;</span>&nbsp; <span class='diff-add'> this.from = from; this.to = to;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return function(str) {</span>&nbsp; <span class='diff-add'> if (!bidiRE.test(str)) return false;</span>&nbsp; <span class='diff-add'> var len = str.length, types = [];</span>&nbsp; <span class='diff-add'> for (var i = 0, type; i < len; ++i)</span>&nbsp; <span class='diff-add'> types.push(type = charType(str.charCodeAt(i)));</span>&nbsp; <span class='diff-add'> // W1. Examine each non-spacing mark (NSM) in the level run, and</span>&nbsp; <span class='diff-add'> // change the type of the NSM to the type of the previous</span>&nbsp; <span class='diff-add'> // character. If the NSM is at the start of the level run, it will</span>&nbsp; <span class='diff-add'> // get the type of sor.</span>&nbsp; <span class='diff-add'> for (var i = 0, prev = outerType; i < len; ++i) {</span>&nbsp; <span class='diff-add'> var type = types[i];</span>&nbsp; <span class='diff-add'> if (type == "m") types[i] = prev;</span>&nbsp; <span class='diff-add'> else prev = type;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // W2. Search backwards from each instance of a European number</span>&nbsp; <span class='diff-add'> // until the first strong type (R, L, AL, or sor) is found. If an</span>&nbsp; <span class='diff-add'> // AL is found, change the type of the European number to Arabic</span>&nbsp; <span class='diff-add'> // number.</span>&nbsp; <span class='diff-add'> // W3. Change all ALs to R.</span>&nbsp; <span class='diff-add'> for (var i = 0, cur = outerType; i < len; ++i) {</span>&nbsp; <span class='diff-add'> var type = types[i];</span>&nbsp; <span class='diff-add'> if (type == "1" && cur == "r") types[i] = "n";</span>&nbsp; <span class='diff-add'> else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // W4. A single European separator between two European numbers</span>&nbsp; <span class='diff-add'> // changes to a European number. A single common separator between</span>&nbsp; <span class='diff-add'> // two numbers of the same type changes to that type.</span>&nbsp; <span class='diff-add'> for (var i = 1, prev = types[0]; i < len - 1; ++i) {</span>&nbsp; <span class='diff-add'> var type = types[i];</span>&nbsp; <span class='diff-add'> if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1";</span>&nbsp; <span class='diff-add'> else if (type == "," && prev == types[i+1] &&</span>&nbsp; <span class='diff-add'> (prev == "1" || prev == "n")) types[i] = prev;</span>&nbsp; <span class='diff-add'> prev = type;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // W5. A sequence of European terminators adjacent to European</span>&nbsp; <span class='diff-add'> // numbers changes to all European numbers.</span>&nbsp; <span class='diff-add'> // W6. Otherwise, separators and terminators change to Other</span>&nbsp; <span class='diff-add'> // Neutral.</span>&nbsp; <span class='diff-add'> for (var i = 0; i < len; ++i) {</span>&nbsp; <span class='diff-add'> var type = types[i];</span>&nbsp; <span class='diff-add'> if (type == ",") types[i] = "N";</span>&nbsp; <span class='diff-add'> else if (type == "%") {</span>&nbsp; <span class='diff-add'> for (var end = i + 1; end < len && types[end] == "%"; ++end) {}</span>&nbsp; <span class='diff-add'> var replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";</span>&nbsp; <span class='diff-add'> for (var j = i; j < end; ++j) types[j] = replace;</span>&nbsp; <span class='diff-add'> i = end - 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // W7. Search backwards from each instance of a European number</span>&nbsp; <span class='diff-add'> // until the first strong type (R, L, or sor) is found. If an L is</span>&nbsp; <span class='diff-add'> // found, then change the type of the European number to L.</span>&nbsp; <span class='diff-add'> for (var i = 0, cur = outerType; i < len; ++i) {</span>&nbsp; <span class='diff-add'> var type = types[i];</span>&nbsp; <span class='diff-add'> if (cur == "L" && type == "1") types[i] = "L";</span>&nbsp; <span class='diff-add'> else if (isStrong.test(type)) cur = type;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // N1. A sequence of neutrals takes the direction of the</span>&nbsp; <span class='diff-add'> // surrounding strong text if the text on both sides has the same</span>&nbsp; <span class='diff-add'> // direction. European and Arabic numbers act as if they were R in</span>&nbsp; <span class='diff-add'> // terms of their influence on neutrals. Start-of-level-run (sor)</span>&nbsp; <span class='diff-add'> // and end-of-level-run (eor) are used at level run boundaries.</span>&nbsp; <span class='diff-add'> // N2. Any remaining neutrals take the embedding direction.</span>&nbsp; <span class='diff-add'> for (var i = 0; i < len; ++i) {</span>&nbsp; <span class='diff-add'> if (isNeutral.test(types[i])) {</span>&nbsp; <span class='diff-add'> for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}</span>&nbsp; <span class='diff-add'> var before = (i ? types[i-1] : outerType) == "L";</span>&nbsp; <span class='diff-add'> var after = (end < len ? types[end] : outerType) == "L";</span>&nbsp; <span class='diff-add'> var replace = before || after ? "L" : "R";</span>&nbsp; <span class='diff-add'> for (var j = i; j < end; ++j) types[j] = replace;</span>&nbsp; <span class='diff-add'> i = end - 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Here we depart from the documented algorithm, in order to avoid</span>&nbsp; <span class='diff-add'> // building up an actual levels array. Since there are only three</span>&nbsp; <span class='diff-add'> // levels (0, 1, 2) in an implementation that doesn't take</span>&nbsp; <span class='diff-add'> // explicit embedding into account, we can build up the order on</span>&nbsp; <span class='diff-add'> // the fly, without following the level-based algorithm.</span>&nbsp; <span class='diff-add'> var order = [], m;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < len;) {</span>&nbsp; <span class='diff-add'> if (countsAsLeft.test(types[i])) {</span>&nbsp; <span class='diff-add'> var start = i;</span>&nbsp; <span class='diff-add'> for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}</span>&nbsp; <span class='diff-add'> order.push(new BidiSpan(0, start, i));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var pos = i, at = order.length;</span>&nbsp; <span class='diff-add'> for (++i; i < len && types[i] != "L"; ++i) {}</span>&nbsp; <span class='diff-add'> for (var j = pos; j < i;) {</span>&nbsp; <span class='diff-add'> if (countsAsNum.test(types[j])) {</span>&nbsp; <span class='diff-add'> if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));</span>&nbsp; <span class='diff-add'> var nstart = j;</span>&nbsp; <span class='diff-add'> for (++j; j < i && countsAsNum.test(types[j]); ++j) {}</span>&nbsp; <span class='diff-add'> order.splice(at, 0, new BidiSpan(2, nstart, j));</span>&nbsp; <span class='diff-add'> pos = j;</span>&nbsp; <span class='diff-add'> } else ++j;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (order[0].level == 1 && (m = str.match(/^\s+/))) {</span>&nbsp; <span class='diff-add'> order[0].from = m[0].length;</span>&nbsp; <span class='diff-add'> order.unshift(new BidiSpan(0, 0, m[0].length));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (lst(order).level == 1 && (m = str.match(/\s+$/))) {</span>&nbsp; <span class='diff-add'> lst(order).to -= m[0].length;</span>&nbsp; <span class='diff-add'> order.push(new BidiSpan(0, len - m[0].length, len));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (order[0].level != lst(order).level)</span>&nbsp; <span class='diff-add'> order.push(new BidiSpan(order[0].level, len, len));</span>&nbsp; <span class='diff-add'> return order;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> })();</span>&nbsp; <span class='diff-add'> // THE END</span>&nbsp; <span class='diff-add'> CodeMirror.version = "4.11.0";</span>&nbsp; <span class='diff-add'> return CodeMirror;</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/comm.js b/ipynb/Array-feature-overlap-05_files/comm.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..cffd66f</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/comm.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> //-----------------------------------------------------------------------</span>&nbsp; <span class='diff-add'> // CommManager class</span>&nbsp; <span class='diff-add'> //-----------------------------------------------------------------------</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var CommManager = function (kernel) {</span>&nbsp; <span class='diff-add'> this.comms = {};</span>&nbsp; <span class='diff-add'> this.targets = {};</span>&nbsp; <span class='diff-add'> if (kernel !== undefined) {</span>&nbsp; <span class='diff-add'> this.init_kernel(kernel);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CommManager.prototype.init_kernel = function (kernel) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * connect the kernel, and register message handlers</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.kernel = kernel;</span>&nbsp; <span class='diff-add'> var msg_types = ['comm_open', 'comm_msg', 'comm_close'];</span>&nbsp; <span class='diff-add'> for (var i = 0; i < msg_types.length; i++) {</span>&nbsp; <span class='diff-add'> var msg_type = msg_types[i];</span>&nbsp; <span class='diff-add'> kernel.register_iopub_handler(msg_type, $.proxy(this[msg_type], this));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CommManager.prototype.new_comm = function (target_name, data, callbacks, metadata) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Create a new Comm, register it, and open its Kernel-side counterpart</span>&nbsp; <span class='diff-add'> * Mimics the auto-registration in `Comm.__init__` in the IPython Comm</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var comm = new Comm(target_name);</span>&nbsp; <span class='diff-add'> this.register_comm(comm);</span>&nbsp; <span class='diff-add'> comm.open(data, callbacks, metadata);</span>&nbsp; <span class='diff-add'> return comm;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CommManager.prototype.register_target = function (target_name, f) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Register a target function for a given target name</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.targets[target_name] = f;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CommManager.prototype.unregister_target = function (target_name, f) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Unregister a target function for a given target name</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> delete this.targets[target_name];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CommManager.prototype.register_comm = function (comm) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Register a comm in the mapping</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.comms[comm.comm_id] = Promise.resolve(comm);</span>&nbsp; <span class='diff-add'> comm.kernel = this.kernel;</span>&nbsp; <span class='diff-add'> return comm.comm_id;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CommManager.prototype.unregister_comm = function (comm) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Remove a comm from the mapping</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> delete this.comms[comm.comm_id];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // comm message handlers</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CommManager.prototype.comm_open = function (msg) {</span>&nbsp; <span class='diff-add'> var content = msg.content;</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var comm_id = content.comm_id;</span>&nbsp; <span class='diff-add'> this.comms[comm_id] = utils.load_class(content.target_name, content.target_module, </span>&nbsp; <span class='diff-add'> this.targets).then(function(target) {</span>&nbsp; <span class='diff-add'> var comm = new Comm(content.target_name, comm_id);</span>&nbsp; <span class='diff-add'> comm.kernel = that.kernel;</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> var response = target(comm, msg);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> comm.close();</span>&nbsp; <span class='diff-add'> that.unregister_comm(comm);</span>&nbsp; <span class='diff-add'> var wrapped_error = new utils.WrappedError("Exception opening new comm", e);</span>&nbsp; <span class='diff-add'> console.error(wrapped_error);</span>&nbsp; <span class='diff-add'> return Promise.reject(wrapped_error);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Regardless of the target return value, we need to</span>&nbsp; <span class='diff-add'> // then return the comm</span>&nbsp; <span class='diff-add'> return Promise.resolve(response).then(function() {return comm;});</span>&nbsp; <span class='diff-add'> }, utils.reject('Could not open comm', true));</span>&nbsp; <span class='diff-add'> return this.comms[comm_id];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CommManager.prototype.comm_close = function(msg) {</span>&nbsp; <span class='diff-add'> var content = msg.content;</span>&nbsp; <span class='diff-add'> if (this.comms[content.comm_id] === undefined) {</span>&nbsp; <span class='diff-add'> console.error('Comm promise not found for comm id ' + content.comm_id);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.comms[content.comm_id] = this.comms[content.comm_id].then(function(comm) {</span>&nbsp; <span class='diff-add'> that.unregister_comm(comm);</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> comm.handle_close(msg);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> console.log("Exception closing comm: ", e, e.stack, msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // don't return a comm, so that further .then() functions</span>&nbsp; <span class='diff-add'> // get an undefined comm input</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> CommManager.prototype.comm_msg = function(msg) {</span>&nbsp; <span class='diff-add'> var content = msg.content;</span>&nbsp; <span class='diff-add'> if (this.comms[content.comm_id] === undefined) {</span>&nbsp; <span class='diff-add'> console.error('Comm promise not found for comm id ' + content.comm_id);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.comms[content.comm_id] = this.comms[content.comm_id].then(function(comm) {</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> comm.handle_msg(msg);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> console.log("Exception handling comm msg: ", e, e.stack, msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return comm;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> //-----------------------------------------------------------------------</span>&nbsp; <span class='diff-add'> // Comm base class</span>&nbsp; <span class='diff-add'> //-----------------------------------------------------------------------</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var Comm = function (target_name, comm_id) {</span>&nbsp; <span class='diff-add'> this.target_name = target_name;</span>&nbsp; <span class='diff-add'> this.comm_id = comm_id || utils.uuid();</span>&nbsp; <span class='diff-add'> this._msg_callback = this._close_callback = null;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // methods for sending messages</span>&nbsp; <span class='diff-add'> Comm.prototype.open = function (data, callbacks, metadata) {</span>&nbsp; <span class='diff-add'> var content = {</span>&nbsp; <span class='diff-add'> comm_id : this.comm_id,</span>&nbsp; <span class='diff-add'> target_name : this.target_name,</span>&nbsp; <span class='diff-add'> data : data || {},</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return this.kernel.send_shell_message("comm_open", content, callbacks, metadata);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Comm.prototype.send = function (data, callbacks, metadata, buffers) {</span>&nbsp; <span class='diff-add'> var content = {</span>&nbsp; <span class='diff-add'> comm_id : this.comm_id,</span>&nbsp; <span class='diff-add'> data : data || {},</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return this.kernel.send_shell_message("comm_msg", content, callbacks, metadata, buffers);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Comm.prototype.close = function (data, callbacks, metadata) {</span>&nbsp; <span class='diff-add'> var content = {</span>&nbsp; <span class='diff-add'> comm_id : this.comm_id,</span>&nbsp; <span class='diff-add'> data : data || {},</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return this.kernel.send_shell_message("comm_close", content, callbacks, metadata);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // methods for registering callbacks for incoming messages</span>&nbsp; <span class='diff-add'> Comm.prototype._register_callback = function (key, callback) {</span>&nbsp; <span class='diff-add'> this['_' + key + '_callback'] = callback;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Comm.prototype.on_msg = function (callback) {</span>&nbsp; <span class='diff-add'> this._register_callback('msg', callback);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Comm.prototype.on_close = function (callback) {</span>&nbsp; <span class='diff-add'> this._register_callback('close', callback);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // methods for handling incoming messages</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Comm.prototype._callback = function (key, msg) {</span>&nbsp; <span class='diff-add'> var callback = this['_' + key + '_callback'];</span>&nbsp; <span class='diff-add'> if (callback) {</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> callback(msg);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> console.log("Exception in Comm callback", e, e.stack, msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Comm.prototype.handle_msg = function (msg) {</span>&nbsp; <span class='diff-add'> this._callback('msg', msg);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Comm.prototype.handle_close = function (msg) {</span>&nbsp; <span class='diff-add'> this._callback('close', msg);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // For backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.CommManager = CommManager;</span>&nbsp; <span class='diff-add'> IPython.Comm = Comm;</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'CommManager': CommManager,</span>&nbsp; <span class='diff-add'> 'Comm': Comm</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/comment.js b/ipynb/Array-feature-overlap-05_files/comment.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..2dd114d</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/comment.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../../lib/codemirror"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../../lib/codemirror"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var noOptions = {};</span>&nbsp; <span class='diff-add'> var nonWS = /[^\s\u00a0]/;</span>&nbsp; <span class='diff-add'> var Pos = CodeMirror.Pos;</span>&nbsp; <span class='diff-add'> function firstNonWS(str) {</span>&nbsp; <span class='diff-add'> var found = str.search(nonWS);</span>&nbsp; <span class='diff-add'> return found == -1 ? 0 : found;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> CodeMirror.commands.toggleComment = function(cm) {</span>&nbsp; <span class='diff-add'> var minLine = Infinity, ranges = cm.listSelections(), mode = null;</span>&nbsp; <span class='diff-add'> for (var i = ranges.length - 1; i >= 0; i--) {</span>&nbsp; <span class='diff-add'> var from = ranges[i].from(), to = ranges[i].to();</span>&nbsp; <span class='diff-add'> if (from.line >= minLine) continue;</span>&nbsp; <span class='diff-add'> if (to.line >= minLine) to = Pos(minLine, 0);</span>&nbsp; <span class='diff-add'> minLine = from.line;</span>&nbsp; <span class='diff-add'> if (mode == null) {</span>&nbsp; <span class='diff-add'> if (cm.uncomment(from, to)) mode = "un";</span>&nbsp; <span class='diff-add'> else { cm.lineComment(from, to); mode = "line"; }</span>&nbsp; <span class='diff-add'> } else if (mode == "un") {</span>&nbsp; <span class='diff-add'> cm.uncomment(from, to);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> cm.lineComment(from, to);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeMirror.defineExtension("lineComment", function(from, to, options) {</span>&nbsp; <span class='diff-add'> if (!options) options = noOptions;</span>&nbsp; <span class='diff-add'> var self = this, mode = self.getModeAt(from);</span>&nbsp; <span class='diff-add'> var commentString = options.lineComment || mode.lineComment;</span>&nbsp; <span class='diff-add'> if (!commentString) {</span>&nbsp; <span class='diff-add'> if (options.blockCommentStart || mode.blockCommentStart) {</span>&nbsp; <span class='diff-add'> options.fullLines = true;</span>&nbsp; <span class='diff-add'> self.blockComment(from, to, options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var firstLine = self.getLine(from.line);</span>&nbsp; <span class='diff-add'> if (firstLine == null) return;</span>&nbsp; <span class='diff-add'> var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);</span>&nbsp; <span class='diff-add'> var pad = options.padding == null ? " " : options.padding;</span>&nbsp; <span class='diff-add'> var blankLines = options.commentBlankLines || from.line == to.line;</span>&nbsp; <span class='diff-add'> self.operation(function() {</span>&nbsp; <span class='diff-add'> if (options.indent) {</span>&nbsp; <span class='diff-add'> var baseString = firstLine.slice(0, firstNonWS(firstLine));</span>&nbsp; <span class='diff-add'> for (var i = from.line; i < end; ++i) {</span>&nbsp; <span class='diff-add'> var line = self.getLine(i), cut = baseString.length;</span>&nbsp; <span class='diff-add'> if (!blankLines && !nonWS.test(line)) continue;</span>&nbsp; <span class='diff-add'> if (line.slice(0, cut) != baseString) cut = firstNonWS(line);</span>&nbsp; <span class='diff-add'> self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> for (var i = from.line; i < end; ++i) {</span>&nbsp; <span class='diff-add'> if (blankLines || nonWS.test(self.getLine(i)))</span>&nbsp; <span class='diff-add'> self.replaceRange(commentString + pad, Pos(i, 0));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> CodeMirror.defineExtension("blockComment", function(from, to, options) {</span>&nbsp; <span class='diff-add'> if (!options) options = noOptions;</span>&nbsp; <span class='diff-add'> var self = this, mode = self.getModeAt(from);</span>&nbsp; <span class='diff-add'> var startString = options.blockCommentStart || mode.blockCommentStart;</span>&nbsp; <span class='diff-add'> var endString = options.blockCommentEnd || mode.blockCommentEnd;</span>&nbsp; <span class='diff-add'> if (!startString || !endString) {</span>&nbsp; <span class='diff-add'> if ((options.lineComment || mode.lineComment) && options.fullLines != false)</span>&nbsp; <span class='diff-add'> self.lineComment(from, to, options);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var end = Math.min(to.line, self.lastLine());</span>&nbsp; <span class='diff-add'> if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end;</span>&nbsp; <span class='diff-add'> var pad = options.padding == null ? " " : options.padding;</span>&nbsp; <span class='diff-add'> if (from.line > end) return;</span>&nbsp; <span class='diff-add'> self.operation(function() {</span>&nbsp; <span class='diff-add'> if (options.fullLines != false) {</span>&nbsp; <span class='diff-add'> var lastLineHasText = nonWS.test(self.getLine(end));</span>&nbsp; <span class='diff-add'> self.replaceRange(pad + endString, Pos(end));</span>&nbsp; <span class='diff-add'> self.replaceRange(startString + pad, Pos(from.line, 0));</span>&nbsp; <span class='diff-add'> var lead = options.blockCommentLead || mode.blockCommentLead;</span>&nbsp; <span class='diff-add'> if (lead != null) for (var i = from.line + 1; i <= end; ++i)</span>&nbsp; <span class='diff-add'> if (i != end || lastLineHasText)</span>&nbsp; <span class='diff-add'> self.replaceRange(lead + pad, Pos(i, 0));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> self.replaceRange(endString, to);</span>&nbsp; <span class='diff-add'> self.replaceRange(startString, from);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> CodeMirror.defineExtension("uncomment", function(from, to, options) {</span>&nbsp; <span class='diff-add'> if (!options) options = noOptions;</span>&nbsp; <span class='diff-add'> var self = this, mode = self.getModeAt(from);</span>&nbsp; <span class='diff-add'> var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end);</span>&nbsp; <span class='diff-add'> // Try finding line comments</span>&nbsp; <span class='diff-add'> var lineString = options.lineComment || mode.lineComment, lines = [];</span>&nbsp; <span class='diff-add'> var pad = options.padding == null ? " " : options.padding, didSomething;</span>&nbsp; <span class='diff-add'> lineComment: {</span>&nbsp; <span class='diff-add'> if (!lineString) break lineComment;</span>&nbsp; <span class='diff-add'> for (var i = start; i <= end; ++i) {</span>&nbsp; <span class='diff-add'> var line = self.getLine(i);</span>&nbsp; <span class='diff-add'> var found = line.indexOf(lineString);</span>&nbsp; <span class='diff-add'> if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1;</span>&nbsp; <span class='diff-add'> if (found == -1 && (i != end || i == start) && nonWS.test(line)) break lineComment;</span>&nbsp; <span class='diff-add'> if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment;</span>&nbsp; <span class='diff-add'> lines.push(line);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> self.operation(function() {</span>&nbsp; <span class='diff-add'> for (var i = start; i <= end; ++i) {</span>&nbsp; <span class='diff-add'> var line = lines[i - start];</span>&nbsp; <span class='diff-add'> var pos = line.indexOf(lineString), endPos = pos + lineString.length;</span>&nbsp; <span class='diff-add'> if (pos < 0) continue;</span>&nbsp; <span class='diff-add'> if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length;</span>&nbsp; <span class='diff-add'> didSomething = true;</span>&nbsp; <span class='diff-add'> self.replaceRange("", Pos(i, pos), Pos(i, endPos));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (didSomething) return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Try block comments</span>&nbsp; <span class='diff-add'> var startString = options.blockCommentStart || mode.blockCommentStart;</span>&nbsp; <span class='diff-add'> var endString = options.blockCommentEnd || mode.blockCommentEnd;</span>&nbsp; <span class='diff-add'> if (!startString || !endString) return false;</span>&nbsp; <span class='diff-add'> var lead = options.blockCommentLead || mode.blockCommentLead;</span>&nbsp; <span class='diff-add'> var startLine = self.getLine(start), endLine = end == start ? startLine : self.getLine(end);</span>&nbsp; <span class='diff-add'> var open = startLine.indexOf(startString), close = endLine.lastIndexOf(endString);</span>&nbsp; <span class='diff-add'> if (close == -1 && start != end) {</span>&nbsp; <span class='diff-add'> endLine = self.getLine(--end);</span>&nbsp; <span class='diff-add'> close = endLine.lastIndexOf(endString);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (open == -1 || close == -1 ||</span>&nbsp; <span class='diff-add'> !/comment/.test(self.getTokenTypeAt(Pos(start, open + 1))) ||</span>&nbsp; <span class='diff-add'> !/comment/.test(self.getTokenTypeAt(Pos(end, close + 1))))</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> // Avoid killing block comments completely outside the selection.</span>&nbsp; <span class='diff-add'> // Positions of the last startString before the start of the selection, and the first endString after it.</span>&nbsp; <span class='diff-add'> var lastStart = startLine.lastIndexOf(startString, from.ch);</span>&nbsp; <span class='diff-add'> var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length);</span>&nbsp; <span class='diff-add'> if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false;</span>&nbsp; <span class='diff-add'> // Positions of the first endString after the end of the selection, and the last startString before it.</span>&nbsp; <span class='diff-add'> firstEnd = endLine.indexOf(endString, to.ch);</span>&nbsp; <span class='diff-add'> var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch);</span>&nbsp; <span class='diff-add'> lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart;</span>&nbsp; <span class='diff-add'> if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false;</span>&nbsp; <span class='diff-add'> self.operation(function() {</span>&nbsp; <span class='diff-add'> self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)),</span>&nbsp; <span class='diff-add'> Pos(end, close + endString.length));</span>&nbsp; <span class='diff-add'> var openEnd = open + startString.length;</span>&nbsp; <span class='diff-add'> if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length;</span>&nbsp; <span class='diff-add'> self.replaceRange("", Pos(start, open), Pos(start, openEnd));</span>&nbsp; <span class='diff-add'> if (lead) for (var i = start + 1; i <= end; ++i) {</span>&nbsp; <span class='diff-add'> var line = self.getLine(i), found = line.indexOf(lead);</span>&nbsp; <span class='diff-add'> if (found == -1 || nonWS.test(line.slice(0, found))) continue;</span>&nbsp; <span class='diff-add'> var foundEnd = found + lead.length;</span>&nbsp; <span class='diff-add'> if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length;</span>&nbsp; <span class='diff-add'> self.replaceRange("", Pos(i, found), Pos(i, foundEnd));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/completer.js b/ipynb/Array-feature-overlap-05_files/completer.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..5746b6d</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/completer.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'base/js/keyboard',</span>&nbsp; <span class='diff-add'> 'notebook/js/contexthint',</span>&nbsp; <span class='diff-add'> 'codemirror/lib/codemirror',</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils, keyboard, CodeMirror) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> // easier key mapping</span>&nbsp; <span class='diff-add'> var keycodes = keyboard.keycodes;</span>&nbsp; <span class='diff-add'> var prepend_n_prc = function(str, n) {</span>&nbsp; <span class='diff-add'> for( var i =0 ; i< n ; i++){</span>&nbsp; <span class='diff-add'> str = '%'+str ;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return str;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var _existing_completion = function(item, completion_array){</span>&nbsp; <span class='diff-add'> for( var i=0; i < completion_array.length; i++) {</span>&nbsp; <span class='diff-add'> if (completion_array[i].trim().substr(-item.length) == item) {</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // what is the common start of all completions</span>&nbsp; <span class='diff-add'> function shared_start(B, drop_prct) {</span>&nbsp; <span class='diff-add'> if (B.length == 1) {</span>&nbsp; <span class='diff-add'> return B[0];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var A = [];</span>&nbsp; <span class='diff-add'> var common;</span>&nbsp; <span class='diff-add'> var min_lead_prct = 10;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < B.length; i++) {</span>&nbsp; <span class='diff-add'> var str = B[i].str;</span>&nbsp; <span class='diff-add'> var localmin = 0;</span>&nbsp; <span class='diff-add'> if(drop_prct === true){</span>&nbsp; <span class='diff-add'> while ( str.substr(0, 1) == '%') {</span>&nbsp; <span class='diff-add'> localmin = localmin+1;</span>&nbsp; <span class='diff-add'> str = str.substring(1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> min_lead_prct = Math.min(min_lead_prct, localmin);</span>&nbsp; <span class='diff-add'> A.push(str);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (A.length > 1) {</span>&nbsp; <span class='diff-add'> var tem1, tem2, s;</span>&nbsp; <span class='diff-add'> A = A.slice(0).sort();</span>&nbsp; <span class='diff-add'> tem1 = A[0];</span>&nbsp; <span class='diff-add'> s = tem1.length;</span>&nbsp; <span class='diff-add'> tem2 = A.pop();</span>&nbsp; <span class='diff-add'> while (s && tem2.indexOf(tem1) == -1) {</span>&nbsp; <span class='diff-add'> tem1 = tem1.substring(0, --s);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (tem1 === "" || tem2.indexOf(tem1) !== 0) {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> str:prepend_n_prc('', min_lead_prct),</span>&nbsp; <span class='diff-add'> type: "computed",</span>&nbsp; <span class='diff-add'> from: B[0].from,</span>&nbsp; <span class='diff-add'> to: B[0].to</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> str: prepend_n_prc(tem1, min_lead_prct),</span>&nbsp; <span class='diff-add'> type: "computed",</span>&nbsp; <span class='diff-add'> from: B[0].from,</span>&nbsp; <span class='diff-add'> to: B[0].to</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var Completer = function (cell, events) {</span>&nbsp; <span class='diff-add'> this.cell = cell;</span>&nbsp; <span class='diff-add'> this.editor = cell.code_mirror;</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> events.on('kernel_busy.Kernel', function () {</span>&nbsp; <span class='diff-add'> that.skip_kernel_completion = true;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> events.on('kernel_idle.Kernel', function () {</span>&nbsp; <span class='diff-add'> that.skip_kernel_completion = false;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Completer.prototype.startCompletion = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * call for a 'first' completion, that will set the editor and do some</span>&nbsp; <span class='diff-add'> * special behavior like autopicking if only one completion available.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this.editor.somethingSelected()|| this.editor.getSelections().length > 1) return;</span>&nbsp; <span class='diff-add'> this.done = false;</span>&nbsp; <span class='diff-add'> // use to get focus back on opera</span>&nbsp; <span class='diff-add'> this.carry_on_completion(true);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // easy access for julia to monkeypatch</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> Completer.reinvoke_re = /[%0-9a-z._/\\:~-]/i;</span>&nbsp; <span class='diff-add'> Completer.prototype.reinvoke= function(pre_cursor, block, cursor){</span>&nbsp; <span class='diff-add'> return Completer.reinvoke_re.test(pre_cursor);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * pass true as parameter if this is the first invocation of the completer</span>&nbsp; <span class='diff-add'> * this will prevent the completer to dissmiss itself if it is not on a</span>&nbsp; <span class='diff-add'> * word boundary like pressing tab after a space, and make it autopick the</span>&nbsp; <span class='diff-add'> * only choice if there is only one which prevent from popping the UI. as</span>&nbsp; <span class='diff-add'> * well as fast-forwarding the typing if all completion have a common</span>&nbsp; <span class='diff-add'> * shared start</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> Completer.prototype.carry_on_completion = function (first_invocation) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Pass true as parameter if you want the completer to autopick when</span>&nbsp; <span class='diff-add'> * only one completion. This function is automatically reinvoked at</span>&nbsp; <span class='diff-add'> * each keystroke with first_invocation = false</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var cur = this.editor.getCursor();</span>&nbsp; <span class='diff-add'> var line = this.editor.getLine(cur.line);</span>&nbsp; <span class='diff-add'> var pre_cursor = this.editor.getRange({</span>&nbsp; <span class='diff-add'> line: cur.line,</span>&nbsp; <span class='diff-add'> ch: cur.ch - 1</span>&nbsp; <span class='diff-add'> }, cur);</span>&nbsp; <span class='diff-add'> // we need to check that we are still on a word boundary</span>&nbsp; <span class='diff-add'> // because while typing the completer is still reinvoking itself</span>&nbsp; <span class='diff-add'> // so dismiss if we are on a "bad" caracter</span>&nbsp; <span class='diff-add'> if (!this.reinvoke(pre_cursor) && !first_invocation) {</span>&nbsp; <span class='diff-add'> this.close();</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.autopick = false;</span>&nbsp; <span class='diff-add'> if (first_invocation) {</span>&nbsp; <span class='diff-add'> this.autopick = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // We want a single cursor position.</span>&nbsp; <span class='diff-add'> if (this.editor.somethingSelected()|| this.editor.getSelections().length > 1) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // one kernel completion came back, finish_completing will be called with the results</span>&nbsp; <span class='diff-add'> // we fork here and directly call finish completing if kernel is busy</span>&nbsp; <span class='diff-add'> var cursor_pos = utils.to_absolute_cursor_pos(this.editor, cur);</span>&nbsp; <span class='diff-add'> if (this.skip_kernel_completion) {</span>&nbsp; <span class='diff-add'> this.finish_completing({ content: {</span>&nbsp; <span class='diff-add'> matches: [],</span>&nbsp; <span class='diff-add'> cursor_start: cursor_pos,</span>&nbsp; <span class='diff-add'> cursor_end: cursor_pos,</span>&nbsp; <span class='diff-add'> }});</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.cell.kernel.complete(this.editor.getValue(), cursor_pos,</span>&nbsp; <span class='diff-add'> $.proxy(this.finish_completing, this)</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Completer.prototype.finish_completing = function (msg) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * let's build a function that wrap all that stuff into what is needed</span>&nbsp; <span class='diff-add'> * for the new completer:</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var content = msg.content;</span>&nbsp; <span class='diff-add'> var start = content.cursor_start;</span>&nbsp; <span class='diff-add'> var end = content.cursor_end;</span>&nbsp; <span class='diff-add'> var matches = content.matches;</span>&nbsp; <span class='diff-add'> var cur = this.editor.getCursor();</span>&nbsp; <span class='diff-add'> if (end === null) {</span>&nbsp; <span class='diff-add'> // adapted message spec replies don't have cursor position info,</span>&nbsp; <span class='diff-add'> // interpret end=null as current position,</span>&nbsp; <span class='diff-add'> // and negative start relative to that</span>&nbsp; <span class='diff-add'> end = utils.to_absolute_cursor_pos(this.editor, cur);</span>&nbsp; <span class='diff-add'> if (start === null) {</span>&nbsp; <span class='diff-add'> start = end;</span>&nbsp; <span class='diff-add'> } else if (start < 0) {</span>&nbsp; <span class='diff-add'> start = end + start;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var results = CodeMirror.contextHint(this.editor);</span>&nbsp; <span class='diff-add'> var filtered_results = [];</span>&nbsp; <span class='diff-add'> //remove results from context completion</span>&nbsp; <span class='diff-add'> //that are already in kernel completion</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> for (i=0; i < results.length; i++) {</span>&nbsp; <span class='diff-add'> if (!_existing_completion(results[i].str, matches)) {</span>&nbsp; <span class='diff-add'> filtered_results.push(results[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // append the introspection result, in order, at at the beginning of</span>&nbsp; <span class='diff-add'> // the table and compute the replacement range from current cursor</span>&nbsp; <span class='diff-add'> // positon and matched_text length.</span>&nbsp; <span class='diff-add'> for (i = matches.length - 1; i >= 0; --i) {</span>&nbsp; <span class='diff-add'> filtered_results.unshift({</span>&nbsp; <span class='diff-add'> str: matches[i],</span>&nbsp; <span class='diff-add'> type: "introspection",</span>&nbsp; <span class='diff-add'> from: utils.from_absolute_cursor_pos(this.editor, start),</span>&nbsp; <span class='diff-add'> to: utils.from_absolute_cursor_pos(this.editor, end)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // one the 2 sources results have been merge, deal with it</span>&nbsp; <span class='diff-add'> this.raw_result = filtered_results;</span>&nbsp; <span class='diff-add'> // if empty result return</span>&nbsp; <span class='diff-add'> if (!this.raw_result || !this.raw_result.length) return;</span>&nbsp; <span class='diff-add'> // When there is only one completion, use it directly.</span>&nbsp; <span class='diff-add'> if (this.autopick && this.raw_result.length == 1) {</span>&nbsp; <span class='diff-add'> this.insert(this.raw_result[0]);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.raw_result.length == 1) {</span>&nbsp; <span class='diff-add'> // test if first and only completion totally matches</span>&nbsp; <span class='diff-add'> // what is typed, in this case dismiss</span>&nbsp; <span class='diff-add'> var str = this.raw_result[0].str;</span>&nbsp; <span class='diff-add'> var pre_cursor = this.editor.getRange({</span>&nbsp; <span class='diff-add'> line: cur.line,</span>&nbsp; <span class='diff-add'> ch: cur.ch - str.length</span>&nbsp; <span class='diff-add'> }, cur);</span>&nbsp; <span class='diff-add'> if (pre_cursor == str) {</span>&nbsp; <span class='diff-add'> this.close();</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!this.visible) {</span>&nbsp; <span class='diff-add'> this.complete = $('<div/>').addClass('completions');</span>&nbsp; <span class='diff-add'> this.complete.attr('id', 'complete');</span>&nbsp; <span class='diff-add'> // Currently webkit doesn't use the size attr correctly. See:</span>&nbsp; <span class='diff-add'> // https://code.google.com/p/chromium/issues/detail?id=4579</span>&nbsp; <span class='diff-add'> this.sel = $('<select/>')</span>&nbsp; <span class='diff-add'> .attr('tabindex', -1)</span>&nbsp; <span class='diff-add'> .attr('multiple', 'true');</span>&nbsp; <span class='diff-add'> this.complete.append(this.sel);</span>&nbsp; <span class='diff-add'> this.visible = true;</span>&nbsp; <span class='diff-add'> $('body').append(this.complete);</span>&nbsp; <span class='diff-add'> //build the container</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.sel.dblclick(function () {</span>&nbsp; <span class='diff-add'> that.pick();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.sel.focus(function () {</span>&nbsp; <span class='diff-add'> that.editor.focus();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this._handle_keydown = function (cm, event) {</span>&nbsp; <span class='diff-add'> that.keydown(event);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.editor.on('keydown', this._handle_keydown);</span>&nbsp; <span class='diff-add'> this._handle_keypress = function (cm, event) {</span>&nbsp; <span class='diff-add'> that.keypress(event);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.editor.on('keypress', this._handle_keypress);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.sel.attr('size', Math.min(10, this.raw_result.length));</span>&nbsp; <span class='diff-add'> // After everything is on the page, compute the postion.</span>&nbsp; <span class='diff-add'> // We put it above the code if it is too close to the bottom of the page.</span>&nbsp; <span class='diff-add'> var pos = this.editor.cursorCoords(</span>&nbsp; <span class='diff-add'> utils.from_absolute_cursor_pos(this.editor, start)</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> var left = pos.left-3;</span>&nbsp; <span class='diff-add'> var top;</span>&nbsp; <span class='diff-add'> var cheight = this.complete.height();</span>&nbsp; <span class='diff-add'> var wheight = $(window).height();</span>&nbsp; <span class='diff-add'> if (pos.bottom+cheight+5 > wheight) {</span>&nbsp; <span class='diff-add'> top = pos.top-cheight-4;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> top = pos.bottom+1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.complete.css('left', left + 'px');</span>&nbsp; <span class='diff-add'> this.complete.css('top', top + 'px');</span>&nbsp; <span class='diff-add'> // Clear and fill the list.</span>&nbsp; <span class='diff-add'> this.sel.text('');</span>&nbsp; <span class='diff-add'> this.build_gui_list(this.raw_result);</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Completer.prototype.insert = function (completion) {</span>&nbsp; <span class='diff-add'> this.editor.replaceRange(completion.str, completion.from, completion.to);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Completer.prototype.build_gui_list = function (completions) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < completions.length; ++i) {</span>&nbsp; <span class='diff-add'> var opt = $('<option/>').text(completions[i].str).addClass(completions[i].type);</span>&nbsp; <span class='diff-add'> this.sel.append(opt);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.sel.children().first().attr('selected', 'true');</span>&nbsp; <span class='diff-add'> this.sel.scrollTop(0);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Completer.prototype.close = function () {</span>&nbsp; <span class='diff-add'> this.done = true;</span>&nbsp; <span class='diff-add'> $('#complete').remove();</span>&nbsp; <span class='diff-add'> this.editor.off('keydown', this._handle_keydown);</span>&nbsp; <span class='diff-add'> this.editor.off('keypress', this._handle_keypress);</span>&nbsp; <span class='diff-add'> this.visible = false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Completer.prototype.pick = function () {</span>&nbsp; <span class='diff-add'> this.insert(this.raw_result[this.sel[0].selectedIndex]);</span>&nbsp; <span class='diff-add'> this.close();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Completer.prototype.keydown = function (event) {</span>&nbsp; <span class='diff-add'> var code = event.keyCode;</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> // Enter</span>&nbsp; <span class='diff-add'> if (code == keycodes.enter) {</span>&nbsp; <span class='diff-add'> event.codemirrorIgnore = true;</span>&nbsp; <span class='diff-add'> event._ipkmIgnore = true;</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> this.pick();</span>&nbsp; <span class='diff-add'> // Escape or backspace</span>&nbsp; <span class='diff-add'> } else if (code == keycodes.esc || code == keycodes.backspace) {</span>&nbsp; <span class='diff-add'> event.codemirrorIgnore = true;</span>&nbsp; <span class='diff-add'> event._ipkmIgnore = true;</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> this.close();</span>&nbsp; <span class='diff-add'> } else if (code == keycodes.tab) {</span>&nbsp; <span class='diff-add'> //all the fastforwarding operation,</span>&nbsp; <span class='diff-add'> //Check that shared start is not null which can append with prefixed completion</span>&nbsp; <span class='diff-add'> // like %pylab , pylab have no shred start, and ff will result in py<tab><tab></span>&nbsp; <span class='diff-add'> // to erase py</span>&nbsp; <span class='diff-add'> var sh = shared_start(this.raw_result, true);</span>&nbsp; <span class='diff-add'> if (sh) {</span>&nbsp; <span class='diff-add'> this.insert(sh);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.close();</span>&nbsp; <span class='diff-add'> //reinvoke self</span>&nbsp; <span class='diff-add'> setTimeout(function () {</span>&nbsp; <span class='diff-add'> that.carry_on_completion();</span>&nbsp; <span class='diff-add'> }, 50);</span>&nbsp; <span class='diff-add'> } else if (code == keycodes.up || code == keycodes.down) {</span>&nbsp; <span class='diff-add'> // need to do that to be able to move the arrow</span>&nbsp; <span class='diff-add'> // when on the first or last line ofo a code cell</span>&nbsp; <span class='diff-add'> event.codemirrorIgnore = true;</span>&nbsp; <span class='diff-add'> event._ipkmIgnore = true;</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> var options = this.sel.find('option');</span>&nbsp; <span class='diff-add'> var index = this.sel[0].selectedIndex;</span>&nbsp; <span class='diff-add'> if (code == keycodes.up) {</span>&nbsp; <span class='diff-add'> index--;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code == keycodes.down) {</span>&nbsp; <span class='diff-add'> index++;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> index = Math.min(Math.max(index, 0), options.length-1);</span>&nbsp; <span class='diff-add'> this.sel[0].selectedIndex = index;</span>&nbsp; <span class='diff-add'> } else if (code == keycodes.pageup || code == keycodes.pagedown) {</span>&nbsp; <span class='diff-add'> event._ipkmIgnore = true;</span>&nbsp; <span class='diff-add'> var options = this.sel.find('option');</span>&nbsp; <span class='diff-add'> var index = this.sel[0].selectedIndex;</span>&nbsp; <span class='diff-add'> if (code == keycodes.pageup) {</span>&nbsp; <span class='diff-add'> index -= 10; // As 10 is the hard coded size of the drop down menu</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> index += 10;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> index = Math.min(Math.max(index, 0), options.length-1);</span>&nbsp; <span class='diff-add'> this.sel[0].selectedIndex = index;</span>&nbsp; <span class='diff-add'> } else if (code == keycodes.left || code == keycodes.right) {</span>&nbsp; <span class='diff-add'> this.close();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Completer.prototype.keypress = function (event) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * FIXME: This is a band-aid.</span>&nbsp; <span class='diff-add'> * on keypress, trigger insertion of a single character.</span>&nbsp; <span class='diff-add'> * This simulates the old behavior of completion as you type,</span>&nbsp; <span class='diff-add'> * before events were disconnected and CodeMirror stopped</span>&nbsp; <span class='diff-add'> * receiving events while the completer is focused.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var code = event.keyCode;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // don't handle keypress if it's not a character (arrows on FF)</span>&nbsp; <span class='diff-add'> // or ENTER/TAB</span>&nbsp; <span class='diff-add'> if (event.charCode === 0 ||</span>&nbsp; <span class='diff-add'> code == keycodes.tab ||</span>&nbsp; <span class='diff-add'> code == keycodes.enter</span>&nbsp; <span class='diff-add'> ) return;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.close();</span>&nbsp; <span class='diff-add'> this.editor.focus();</span>&nbsp; <span class='diff-add'> setTimeout(function () {</span>&nbsp; <span class='diff-add'> that.carry_on_completion();</span>&nbsp; <span class='diff-add'> }, 50);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // For backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.Completer = Completer;</span>&nbsp; <span class='diff-add'> return {'Completer': Completer};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/config.js b/ipynb/Array-feature-overlap-05_files/config.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..0d2a9f9</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/config.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'>function($, utils) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var ConfigSection = function(section_name, options) {</span>&nbsp; <span class='diff-add'> this.section_name = section_name;</span>&nbsp; <span class='diff-add'> this.base_url = options.base_url;</span>&nbsp; <span class='diff-add'> this.data = {};</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /* .loaded is a promise, fulfilled the first time the config is loaded</span>&nbsp; <span class='diff-add'> * from the server. Code can do:</span>&nbsp; <span class='diff-add'> * conf.loaded.then(function() { ... using conf.data ... });</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this._one_load_finished = false;</span>&nbsp; <span class='diff-add'> this.loaded = new Promise(function(resolve, reject) {</span>&nbsp; <span class='diff-add'> that._finish_firstload = resolve;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ConfigSection.prototype.api_url = function() {</span>&nbsp; <span class='diff-add'> return utils.url_join_encode(this.base_url, 'api/config', this.section_name);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> ConfigSection.prototype._load_done = function() {</span>&nbsp; <span class='diff-add'> if (!this._one_load_finished) {</span>&nbsp; <span class='diff-add'> this._one_load_finished = true;</span>&nbsp; <span class='diff-add'> this._finish_firstload();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> ConfigSection.prototype.load = function() {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(this.api_url(), {</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "GET",</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> }).then(function(data) {</span>&nbsp; <span class='diff-add'> that.data = data;</span>&nbsp; <span class='diff-add'> that._load_done();</span>&nbsp; <span class='diff-add'> return data;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Modify the config values stored. Update the local data immediately,</span>&nbsp; <span class='diff-add'> * send the change to the server, and use the updated data from the server</span>&nbsp; <span class='diff-add'> * when the reply comes.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> ConfigSection.prototype.update = function(newdata) {</span>&nbsp; <span class='diff-add'> $.extend(true, this.data, newdata); // true -> recursive update</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(this.api_url(), {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> type : "PATCH",</span>&nbsp; <span class='diff-add'> data: JSON.stringify(newdata),</span>&nbsp; <span class='diff-add'> dataType : "json",</span>&nbsp; <span class='diff-add'> contentType: 'application/json',</span>&nbsp; <span class='diff-add'> }).then(function(data) {</span>&nbsp; <span class='diff-add'> that.data = data;</span>&nbsp; <span class='diff-add'> that._load_done();</span>&nbsp; <span class='diff-add'> return data;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var ConfigWithDefaults = function(section, defaults, classname) {</span>&nbsp; <span class='diff-add'> this.section = section;</span>&nbsp; <span class='diff-add'> this.defaults = defaults;</span>&nbsp; <span class='diff-add'> this.classname = classname;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> ConfigWithDefaults.prototype._class_data = function() {</span>&nbsp; <span class='diff-add'> if (this.classname) {</span>&nbsp; <span class='diff-add'> return this.section.data[this.classname] || {};</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return this.section.data</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Wait for config to have loaded, then get a value or the default.</span>&nbsp; <span class='diff-add'> * Returns a promise.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> ConfigWithDefaults.prototype.get = function(key) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return this.section.loaded.then(function() {</span>&nbsp; <span class='diff-add'> return this._class_data()[key] || this.defaults[key]</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Return a config value. If config is not yet loaded, return the default</span>&nbsp; <span class='diff-add'> * instead of waiting for it to load.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> ConfigWithDefaults.prototype.get_sync = function(key) {</span>&nbsp; <span class='diff-add'> return this._class_data()[key] || this.defaults[key];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a config value. Send the update to the server, and change our</span>&nbsp; <span class='diff-add'> * local copy of the data immediately.</span>&nbsp; <span class='diff-add'> * Returns a promise which is fulfilled when the server replies to the</span>&nbsp; <span class='diff-add'> * change.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> ConfigWithDefaults.prototype.set = function(key, value) {</span>&nbsp; <span class='diff-add'> var d = {};</span>&nbsp; <span class='diff-add'> d[key] = value;</span>&nbsp; <span class='diff-add'> if (this.classname) {</span>&nbsp; <span class='diff-add'> var d2 = {};</span>&nbsp; <span class='diff-add'> d2[this.classname] = d;</span>&nbsp; <span class='diff-add'> return this.section.update(d2);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return this.section.update(d);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> return {ConfigSection: ConfigSection,</span>&nbsp; <span class='diff-add'> ConfigWithDefaults: ConfigWithDefaults,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/contents.js b/ipynb/Array-feature-overlap-05_files/contents.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..263c052</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/contents.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define(function(require) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var $ = require('jquery');</span>&nbsp; <span class='diff-add'> var utils = require('base/js/utils');</span>&nbsp; <span class='diff-add'> var Contents = function(options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * A contents handles passing file operations</span>&nbsp; <span class='diff-add'> * to the back-end. This includes checkpointing</span>&nbsp; <span class='diff-add'> * with the normal file operations.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters:</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> * base_url: string</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.base_url = options.base_url;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** Error type */</span>&nbsp; <span class='diff-add'> Contents.DIRECTORY_NOT_EMPTY_ERROR = 'DirectoryNotEmptyError';</span>&nbsp; <span class='diff-add'> Contents.DirectoryNotEmptyError = function() {</span>&nbsp; <span class='diff-add'> // Constructor</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // An error representing the result of attempting to delete a non-empty</span>&nbsp; <span class='diff-add'> // directory.</span>&nbsp; <span class='diff-add'> this.message = 'A directory must be empty before being deleted.';</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Contents.DirectoryNotEmptyError.prototype = Object.create(Error.prototype);</span>&nbsp; <span class='diff-add'> Contents.DirectoryNotEmptyError.prototype.name =</span>&nbsp; <span class='diff-add'> Contents.DIRECTORY_NOT_EMPTY_ERROR;</span>&nbsp; <span class='diff-add'> Contents.prototype.api_url = function() {</span>&nbsp; <span class='diff-add'> var url_parts = [this.base_url, 'api/contents'].concat(</span>&nbsp; <span class='diff-add'> Array.prototype.slice.apply(arguments));</span>&nbsp; <span class='diff-add'> return utils.url_join_encode.apply(null, url_parts);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Creates a basic error handler that wraps a jqXHR error as an Error.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Takes a callback that accepts an Error, and returns a callback that can</span>&nbsp; <span class='diff-add'> * be passed directly to $.ajax, which will wrap the error from jQuery</span>&nbsp; <span class='diff-add'> * as an Error, and pass that to the original callback.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method create_basic_error_handler</span>&nbsp; <span class='diff-add'> * @param{Function} callback</span>&nbsp; <span class='diff-add'> * @return{Function}</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Contents.prototype.create_basic_error_handler = function(callback) {</span>&nbsp; <span class='diff-add'> if (!callback) {</span>&nbsp; <span class='diff-add'> return utils.log_ajax_error;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return function(xhr, status, error) {</span>&nbsp; <span class='diff-add'> callback(utils.wrap_ajax_error(xhr, status, error));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * File Functions (including notebook operations)</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get a file.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method get</span>&nbsp; <span class='diff-add'> * @param {String} path</span>&nbsp; <span class='diff-add'> * @param {Object} options</span>&nbsp; <span class='diff-add'> * type : 'notebook', 'file', or 'directory'</span>&nbsp; <span class='diff-add'> * format: 'text' or 'base64'; only relevant for type: 'file'</span>&nbsp; <span class='diff-add'> * content: true or false; // whether to include the content</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Contents.prototype.get = function (path, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * We do the call with settings so we can set cache to false.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var settings = {</span>&nbsp; <span class='diff-add'> processData : false,</span>&nbsp; <span class='diff-add'> cache : false,</span>&nbsp; <span class='diff-add'> type : "GET",</span>&nbsp; <span class='diff-add'> dataType : "json",</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var url = this.api_url(path);</span>&nbsp; <span class='diff-add'> var params = {};</span>&nbsp; <span class='diff-add'> if (options.type) { params.type = options.type; }</span>&nbsp; <span class='diff-add'> if (options.format) { params.format = options.format; }</span>&nbsp; <span class='diff-add'> if (options.content === false) { params.content = '0'; }</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(url + '?' + $.param(params), settings);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Creates a new untitled file or directory in the specified directory path.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method new</span>&nbsp; <span class='diff-add'> * @param {String} path: the directory in which to create the new file/directory</span>&nbsp; <span class='diff-add'> * @param {Object} options:</span>&nbsp; <span class='diff-add'> * ext: file extension to use</span>&nbsp; <span class='diff-add'> * type: model type to create ('notebook', 'file', or 'directory')</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Contents.prototype.new_untitled = function(path, options) {</span>&nbsp; <span class='diff-add'> var data = JSON.stringify({</span>&nbsp; <span class='diff-add'> ext: options.ext,</span>&nbsp; <span class='diff-add'> type: options.type</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var settings = {</span>&nbsp; <span class='diff-add'> processData : false,</span>&nbsp; <span class='diff-add'> type : "POST",</span>&nbsp; <span class='diff-add'> data: data,</span>&nbsp; <span class='diff-add'> dataType : "json",</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(this.api_url(path), settings);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Contents.prototype.delete = function(path) {</span>&nbsp; <span class='diff-add'> var settings = {</span>&nbsp; <span class='diff-add'> processData : false,</span>&nbsp; <span class='diff-add'> type : "DELETE",</span>&nbsp; <span class='diff-add'> dataType : "json",</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var url = this.api_url(path);</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(url, settings).catch(</span>&nbsp; <span class='diff-add'> // Translate certain errors to more specific ones.</span>&nbsp; <span class='diff-add'> function(error) {</span>&nbsp; <span class='diff-add'> // TODO: update IPEP27 to specify errors more precisely, so</span>&nbsp; <span class='diff-add'> // that error types can be detected here with certainty.</span>&nbsp; <span class='diff-add'> if (error.xhr.status === 400) {</span>&nbsp; <span class='diff-add'> throw new Contents.DirectoryNotEmptyError();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> throw error;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Contents.prototype.rename = function(path, new_path) {</span>&nbsp; <span class='diff-add'> var data = {path: new_path};</span>&nbsp; <span class='diff-add'> var settings = {</span>&nbsp; <span class='diff-add'> processData : false,</span>&nbsp; <span class='diff-add'> type : "PATCH",</span>&nbsp; <span class='diff-add'> data : JSON.stringify(data),</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> contentType: 'application/json',</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var url = this.api_url(path);</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(url, settings);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Contents.prototype.save = function(path, model) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * We do the call with settings so we can set cache to false.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var settings = {</span>&nbsp; <span class='diff-add'> processData : false,</span>&nbsp; <span class='diff-add'> type : "PUT",</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> data : JSON.stringify(model),</span>&nbsp; <span class='diff-add'> contentType: 'application/json',</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var url = this.api_url(path);</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(url, settings);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Contents.prototype.copy = function(from_file, to_dir) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Copy a file into a given directory via POST</span>&nbsp; <span class='diff-add'> * The server will select the name of the copied file</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var url = this.api_url(to_dir);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var settings = {</span>&nbsp; <span class='diff-add'> processData : false,</span>&nbsp; <span class='diff-add'> type: "POST",</span>&nbsp; <span class='diff-add'> data: JSON.stringify({copy_from: from_file}),</span>&nbsp; <span class='diff-add'> dataType : "json",</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(url, settings);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Checkpointing Functions</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Contents.prototype.create_checkpoint = function(path) {</span>&nbsp; <span class='diff-add'> var url = this.api_url(path, 'checkpoints');</span>&nbsp; <span class='diff-add'> var settings = {</span>&nbsp; <span class='diff-add'> type : "POST",</span>&nbsp; <span class='diff-add'> dataType : "json",</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(url, settings);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Contents.prototype.list_checkpoints = function(path) {</span>&nbsp; <span class='diff-add'> var url = this.api_url(path, 'checkpoints');</span>&nbsp; <span class='diff-add'> var settings = {</span>&nbsp; <span class='diff-add'> type : "GET",</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(url, settings);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Contents.prototype.restore_checkpoint = function(path, checkpoint_id) {</span>&nbsp; <span class='diff-add'> var url = this.api_url(path, 'checkpoints', checkpoint_id);</span>&nbsp; <span class='diff-add'> var settings = {</span>&nbsp; <span class='diff-add'> type : "POST",</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(url, settings);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Contents.prototype.delete_checkpoint = function(path, checkpoint_id) {</span>&nbsp; <span class='diff-add'> var url = this.api_url(path, 'checkpoints', checkpoint_id);</span>&nbsp; <span class='diff-add'> var settings = {</span>&nbsp; <span class='diff-add'> type : "DELETE",</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return utils.promising_ajax(url, settings);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * File management functions</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * List notebooks and directories at a given path</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * On success, load_callback is called with an array of dictionaries</span>&nbsp; <span class='diff-add'> * representing individual files or directories. Each dictionary has</span>&nbsp; <span class='diff-add'> * the keys:</span>&nbsp; <span class='diff-add'> * type: "notebook" or "directory"</span>&nbsp; <span class='diff-add'> * created: created date</span>&nbsp; <span class='diff-add'> * last_modified: last modified dat</span>&nbsp; <span class='diff-add'> * @method list_notebooks</span>&nbsp; <span class='diff-add'> * @param {String} path The path to list notebooks in</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Contents.prototype.list_contents = function(path) {</span>&nbsp; <span class='diff-add'> return this.get(path, {type: 'directory'});</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return {'Contents': Contents};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/contexthint.js b/ipynb/Array-feature-overlap-05_files/contexthint.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..30b7cd7</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/contexthint.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>// highly adapted for codemiror jshint</span>&nbsp; <span class='diff-add'>define(['codemirror/lib/codemirror'], function(CodeMirror) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var forEach = function(arr, f) {</span>&nbsp; <span class='diff-add'> for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var arrayContains = function(arr, item) {</span>&nbsp; <span class='diff-add'> if (!Array.prototype.indexOf) {</span>&nbsp; <span class='diff-add'> var i = arr.length;</span>&nbsp; <span class='diff-add'> while (i--) {</span>&nbsp; <span class='diff-add'> if (arr[i] === item) {</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return arr.indexOf(item) != -1;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeMirror.contextHint = function (editor) {</span>&nbsp; <span class='diff-add'> // Find the token at the cursor</span>&nbsp; <span class='diff-add'> var cur = editor.getCursor(),</span>&nbsp; <span class='diff-add'> token = editor.getTokenAt(cur),</span>&nbsp; <span class='diff-add'> tprop = token;</span>&nbsp; <span class='diff-add'> // If it's not a 'word-style' token, ignore the token.</span>&nbsp; <span class='diff-add'> // If it is a property, find out what it is a property of.</span>&nbsp; <span class='diff-add'> var list = [];</span>&nbsp; <span class='diff-add'> var clist = getCompletions(token, editor);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < clist.length; i++) {</span>&nbsp; <span class='diff-add'> list.push({</span>&nbsp; <span class='diff-add'> str: clist[i],</span>&nbsp; <span class='diff-add'> type: "context",</span>&nbsp; <span class='diff-add'> from: {</span>&nbsp; <span class='diff-add'> line: cur.line,</span>&nbsp; <span class='diff-add'> ch: token.start</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> to: {</span>&nbsp; <span class='diff-add'> line: cur.line,</span>&nbsp; <span class='diff-add'> ch: token.end</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return list;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // find all 'words' of current cell</span>&nbsp; <span class='diff-add'> var getAllTokens = function (editor) {</span>&nbsp; <span class='diff-add'> var found = [];</span>&nbsp; <span class='diff-add'> // add to found if not already in it</span>&nbsp; <span class='diff-add'> function maybeAdd(str) {</span>&nbsp; <span class='diff-add'> if (!arrayContains(found, str)) found.push(str);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // loop through all token on all lines</span>&nbsp; <span class='diff-add'> var lineCount = editor.lineCount();</span>&nbsp; <span class='diff-add'> // loop on line</span>&nbsp; <span class='diff-add'> for (var l = 0; l < lineCount; l++) {</span>&nbsp; <span class='diff-add'> var line = editor.getLine(l);</span>&nbsp; <span class='diff-add'> //loop on char</span>&nbsp; <span class='diff-add'> for (var c = 1; c < line.length; c++) {</span>&nbsp; <span class='diff-add'> var tk = editor.getTokenAt({</span>&nbsp; <span class='diff-add'> line: l,</span>&nbsp; <span class='diff-add'> ch: c</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // if token has a class, it has geat chances of beeing</span>&nbsp; <span class='diff-add'> // of interest. Add it to the list of possible completions.</span>&nbsp; <span class='diff-add'> // we could skip token of ClassName 'comment'</span>&nbsp; <span class='diff-add'> // or 'number' and 'operator'</span>&nbsp; <span class='diff-add'> if (tk.className !== null) {</span>&nbsp; <span class='diff-add'> maybeAdd(tk.string);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // jump to char after end of current token</span>&nbsp; <span class='diff-add'> c = tk.end;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return found;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var getCompletions = function(token, editor) {</span>&nbsp; <span class='diff-add'> var candidates = getAllTokens(editor);</span>&nbsp; <span class='diff-add'> // filter all token that have a common start (but nox exactly) the lenght of the current token</span>&nbsp; <span class='diff-add'> var lambda = function (x) {</span>&nbsp; <span class='diff-add'> return (x.indexOf(token.string) === 0 && x != token.string);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var filterd = candidates.filter(lambda);</span>&nbsp; <span class='diff-add'> return filterd;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return {'contextHint': CodeMirror.contextHint};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/custom.css b/ipynb/Array-feature-overlap-05_files/custom.css</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..9f4abda</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/custom.css</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*</span>&nbsp; <span class='diff-add'>Placeholder for custom user CSS</span>&nbsp; <span class='diff-add'>mainly to be overridden in profile/static/custom/custom.css</span>&nbsp; <span class='diff-add'>This will always be an empty file in IPython</span>&nbsp; <span class='diff-add'>*/</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/custom.js b/ipynb/Array-feature-overlap-05_files/custom.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..f8d1afe</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/custom.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// leave at least 2 line with only a star on it below, or doc generation fails</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Placeholder for custom user javascript</span>&nbsp; <span class='diff-add'> * mainly to be overridden in profile/static/custom/custom.js</span>&nbsp; <span class='diff-add'> * This will always be an empty file in IPython</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * User could add any javascript in the `profile/static/custom/custom.js` file</span>&nbsp; <span class='diff-add'> * (and should create it if it does not exist).</span>&nbsp; <span class='diff-add'> * It will be executed by the ipython notebook at load time.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Same thing with `profile/static/custom/custom.css` to inject custom css into the notebook.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Example :</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Create a custom button in toolbar that execute `%qtconsole` in kernel</span>&nbsp; <span class='diff-add'> * and hence open a qtconsole attached to the same kernel as the current notebook</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * $([IPython.events]).on('app_initialized.NotebookApp', function(){</span>&nbsp; <span class='diff-add'> * IPython.toolbar.add_buttons_group([</span>&nbsp; <span class='diff-add'> * {</span>&nbsp; <span class='diff-add'> * 'label' : 'run qtconsole',</span>&nbsp; <span class='diff-add'> * 'icon' : 'icon-terminal', // select your icon from http://fortawesome.github.io/Font-Awesome/icons</span>&nbsp; <span class='diff-add'> * 'callback': function () {</span>&nbsp; <span class='diff-add'> * IPython.notebook.kernel.execute('%qtconsole')</span>&nbsp; <span class='diff-add'> * }</span>&nbsp; <span class='diff-add'> * }</span>&nbsp; <span class='diff-add'> * // add more button here if needed.</span>&nbsp; <span class='diff-add'> * ]);</span>&nbsp; <span class='diff-add'> * });</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Example :</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Use `jQuery.getScript(url [, success(script, textStatus, jqXHR)] );`</span>&nbsp; <span class='diff-add'> * to load custom script into the notebook.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * // to load the metadata ui extension example.</span>&nbsp; <span class='diff-add'> * $.getScript('/static/notebook/js/celltoolbarpresets/example.js');</span>&nbsp; <span class='diff-add'> * // or</span>&nbsp; <span class='diff-add'> * // to load the metadata ui extension to control slideshow mode / reveal js for nbconvert</span>&nbsp; <span class='diff-add'> * $.getScript('/static/notebook/js/celltoolbarpresets/slideshow.js');</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @module IPython</span>&nbsp; <span class='diff-add'> * @namespace IPython</span>&nbsp; <span class='diff-add'> * @class customjs</span>&nbsp; <span class='diff-add'> * @static</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/default.js b/ipynb/Array-feature-overlap-05_files/default.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..1423738</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/default.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'notebook/js/celltoolbar',</span>&nbsp; <span class='diff-add'> 'base/js/dialog',</span>&nbsp; <span class='diff-add'>], function($, celltoolbar, dialog) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var CellToolbar = celltoolbar.CellToolbar;</span>&nbsp; <span class='diff-add'> var raw_edit = function (cell) {</span>&nbsp; <span class='diff-add'> dialog.edit_metadata({</span>&nbsp; <span class='diff-add'> md: cell.metadata,</span>&nbsp; <span class='diff-add'> callback: function (md) {</span>&nbsp; <span class='diff-add'> cell.metadata = md;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> name: 'Cell',</span>&nbsp; <span class='diff-add'> notebook: this.notebook,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var add_raw_edit_button = function(div, cell) {</span>&nbsp; <span class='diff-add'> var button_container = $(div);</span>&nbsp; <span class='diff-add'> var button = $('<button/>')</span>&nbsp; <span class='diff-add'> .addClass("btn btn-default btn-xs")</span>&nbsp; <span class='diff-add'> .text("Edit Metadata")</span>&nbsp; <span class='diff-add'> .click( function () {</span>&nbsp; <span class='diff-add'> raw_edit(cell);</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> button_container.append(button);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var register = function (notebook) {</span>&nbsp; <span class='diff-add'> CellToolbar.register_callback('default.rawedit', add_raw_edit_button);</span>&nbsp; <span class='diff-add'> raw_edit = $.proxy(raw_edit, {</span>&nbsp; <span class='diff-add'> notebook: notebook,</span>&nbsp; <span class='diff-add'> keyboard_manager: notebook.keyboard_manager</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var example_preset = [];</span>&nbsp; <span class='diff-add'> example_preset.push('default.rawedit');</span>&nbsp; <span class='diff-add'> CellToolbar.register_preset('Edit Metadata', example_preset, notebook);</span>&nbsp; <span class='diff-add'> console.log('Default extension for cell metadata editing loaded.');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return {'register': register};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/dialog.js b/ipynb/Array-feature-overlap-05_files/dialog.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..79ac239</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/dialog.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define(function(require) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var CodeMirror = require('codemirror/lib/codemirror');</span>&nbsp; <span class='diff-add'> var IPython = require('base/js/namespace');</span>&nbsp; <span class='diff-add'> var $ = require('jquery');</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * A wrapper around bootstrap modal for easier use</span>&nbsp; <span class='diff-add'> * Pass it an option dictionary with the following properties:</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * - body : <string> or <DOM node>, main content of the dialog</span>&nbsp; <span class='diff-add'> * if pass a <string> it will be wrapped in a p tag and</span>&nbsp; <span class='diff-add'> * html element escaped, unless you specify sanitize=false</span>&nbsp; <span class='diff-add'> * option.</span>&nbsp; <span class='diff-add'> * - title : Dialog title, default to empty string.</span>&nbsp; <span class='diff-add'> * - buttons : dict of btn_options who keys are button label.</span>&nbsp; <span class='diff-add'> * see btn_options below for description</span>&nbsp; <span class='diff-add'> * - open : callback to trigger on dialog open.</span>&nbsp; <span class='diff-add'> * - destroy:</span>&nbsp; <span class='diff-add'> * - notebook : notebook instance</span>&nbsp; <span class='diff-add'> * - keyboard_manager: keyboard manager instance.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Unlike bootstrap modals, the backdrop options is set by default </span>&nbsp; <span class='diff-add'> * to 'static'.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * The rest of the options are passed as is to bootstrap modals. </span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * btn_options: dict with the following property:</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * - click : callback to trigger on click</span>&nbsp; <span class='diff-add'> * - class : css classes to add to button.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> var modal = function (options) {</span>&nbsp; <span class='diff-add'> var modal = $("<div/>")</span>&nbsp; <span class='diff-add'> .addClass("modal")</span>&nbsp; <span class='diff-add'> .addClass("fade")</span>&nbsp; <span class='diff-add'> .attr("role", "dialog");</span>&nbsp; <span class='diff-add'> var dialog = $("<div/>")</span>&nbsp; <span class='diff-add'> .addClass("modal-dialog")</span>&nbsp; <span class='diff-add'> .appendTo(modal);</span>&nbsp; <span class='diff-add'> var dialog_content = $("<div/>")</span>&nbsp; <span class='diff-add'> .addClass("modal-content")</span>&nbsp; <span class='diff-add'> .appendTo(dialog);</span>&nbsp; <span class='diff-add'> if(typeof(options.body) === 'string' && options.sanitize !== false){</span>&nbsp; <span class='diff-add'> options.body = $("<p/>").text(options.body)</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> dialog_content.append(</span>&nbsp; <span class='diff-add'> $("<div/>")</span>&nbsp; <span class='diff-add'> .addClass("modal-header")</span>&nbsp; <span class='diff-add'> .append($("<button>")</span>&nbsp; <span class='diff-add'> .attr("type", "button")</span>&nbsp; <span class='diff-add'> .addClass("close")</span>&nbsp; <span class='diff-add'> .attr("data-dismiss", "modal")</span>&nbsp; <span class='diff-add'> .attr("aria-hidden", "true")</span>&nbsp; <span class='diff-add'> .html("&times;")</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<h4/>")</span>&nbsp; <span class='diff-add'> .addClass('modal-title')</span>&nbsp; <span class='diff-add'> .text(options.title || "")</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<div/>").addClass("modal-body").append(</span>&nbsp; <span class='diff-add'> options.body || $("<p/>")</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var footer = $("<div/>").addClass("modal-footer");</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> for (var label in options.buttons) {</span>&nbsp; <span class='diff-add'> var btn_opts = options.buttons[label];</span>&nbsp; <span class='diff-add'> var button = $("<button/>")</span>&nbsp; <span class='diff-add'> .addClass("btn btn-default btn-sm")</span>&nbsp; <span class='diff-add'> .attr("data-dismiss", "modal")</span>&nbsp; <span class='diff-add'> .text(label);</span>&nbsp; <span class='diff-add'> if (btn_opts.click) {</span>&nbsp; <span class='diff-add'> button.click($.proxy(btn_opts.click, dialog_content));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (btn_opts.class) {</span>&nbsp; <span class='diff-add'> button.addClass(btn_opts.class);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> footer.append(button);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> dialog_content.append(footer);</span>&nbsp; <span class='diff-add'> // hook up on-open event</span>&nbsp; <span class='diff-add'> modal.on("shown.bs.modal", function() {</span>&nbsp; <span class='diff-add'> setTimeout(function() {</span>&nbsp; <span class='diff-add'> footer.find("button").last().focus();</span>&nbsp; <span class='diff-add'> if (options.open) {</span>&nbsp; <span class='diff-add'> $.proxy(options.open, modal)();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, 0);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // destroy modal on hide, unless explicitly asked not to</span>&nbsp; <span class='diff-add'> if (options.destroy === undefined || options.destroy) {</span>&nbsp; <span class='diff-add'> modal.on("hidden.bs.modal", function () {</span>&nbsp; <span class='diff-add'> modal.remove();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> modal.on("hidden.bs.modal", function () {</span>&nbsp; <span class='diff-add'> if (options.notebook) {</span>&nbsp; <span class='diff-add'> var cell = options.notebook.get_selected_cell();</span>&nbsp; <span class='diff-add'> if (cell) cell.select();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (options.keyboard_manager) {</span>&nbsp; <span class='diff-add'> options.keyboard_manager.enable();</span>&nbsp; <span class='diff-add'> options.keyboard_manager.command_mode();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (options.keyboard_manager) {</span>&nbsp; <span class='diff-add'> options.keyboard_manager.disable();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> options.backdrop = options.backdrop || 'static';</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> return modal.modal(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var kernel_modal = function (options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * only one kernel dialog should be open at a time -- but</span>&nbsp; <span class='diff-add'> * other modal dialogs can still be open</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> $('.kernel-modal').modal('hide');</span>&nbsp; <span class='diff-add'> var dialog = modal(options);</span>&nbsp; <span class='diff-add'> dialog.addClass('kernel-modal');</span>&nbsp; <span class='diff-add'> return dialog;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var edit_metadata = function (options) {</span>&nbsp; <span class='diff-add'> options.name = options.name || "Cell";</span>&nbsp; <span class='diff-add'> var error_div = $('<div/>').css('color', 'red');</span>&nbsp; <span class='diff-add'> var message = </span>&nbsp; <span class='diff-add'> "Manually edit the JSON below to manipulate the metadata for this " + options.name + "." +</span>&nbsp; <span class='diff-add'> " We recommend putting custom metadata attributes in an appropriately named sub-structure," +</span>&nbsp; <span class='diff-add'> " so they don't conflict with those of others.";</span>&nbsp; <span class='diff-add'> var textarea = $('<textarea/>')</span>&nbsp; <span class='diff-add'> .attr('rows', '13')</span>&nbsp; <span class='diff-add'> .attr('cols', '80')</span>&nbsp; <span class='diff-add'> .attr('name', 'metadata')</span>&nbsp; <span class='diff-add'> .text(JSON.stringify(options.md || {}, null, 2));</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var dialogform = $('<div/>').attr('title', 'Edit the metadata')</span>&nbsp; <span class='diff-add'> .append(</span>&nbsp; <span class='diff-add'> $('<form/>').append(</span>&nbsp; <span class='diff-add'> $('<fieldset/>').append(</span>&nbsp; <span class='diff-add'> $('<label/>')</span>&nbsp; <span class='diff-add'> .attr('for','metadata')</span>&nbsp; <span class='diff-add'> .text(message)</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> .append(error_div)</span>&nbsp; <span class='diff-add'> .append($('<br/>'))</span>&nbsp; <span class='diff-add'> .append(textarea)</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> var editor = CodeMirror.fromTextArea(textarea[0], {</span>&nbsp; <span class='diff-add'> lineNumbers: true,</span>&nbsp; <span class='diff-add'> matchBrackets: true,</span>&nbsp; <span class='diff-add'> indentUnit: 2,</span>&nbsp; <span class='diff-add'> autoIndent: true,</span>&nbsp; <span class='diff-add'> mode: 'application/json',</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var modal_obj = modal({</span>&nbsp; <span class='diff-add'> title: "Edit " + options.name + " Metadata",</span>&nbsp; <span class='diff-add'> body: dialogform,</span>&nbsp; <span class='diff-add'> buttons: {</span>&nbsp; <span class='diff-add'> OK: { class : "btn-primary",</span>&nbsp; <span class='diff-add'> click: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * validate json and set it</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var new_md;</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> new_md = JSON.parse(editor.getValue());</span>&nbsp; <span class='diff-add'> } catch(e) {</span>&nbsp; <span class='diff-add'> console.log(e);</span>&nbsp; <span class='diff-add'> error_div.text('WARNING: Could not save invalid JSON.');</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> options.callback(new_md);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> Cancel: {}</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> notebook: options.notebook,</span>&nbsp; <span class='diff-add'> keyboard_manager: options.keyboard_manager,</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> modal_obj.on('shown.bs.modal', function(){ editor.refresh(); });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var dialog = {</span>&nbsp; <span class='diff-add'> modal : modal,</span>&nbsp; <span class='diff-add'> kernel_modal : kernel_modal,</span>&nbsp; <span class='diff-add'> edit_metadata : edit_metadata,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.dialog = dialog;</span>&nbsp; <span class='diff-add'> return dialog;</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/encoding.js b/ipynb/Array-feature-overlap-05_files/encoding.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..5e99861</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/encoding.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// If we're in node require encoding-indexes and attach it to the global.</span>&nbsp; <span class='diff-add'>if (typeof module !== "undefined" && module.exports) {</span>&nbsp; <span class='diff-add'> this["encoding-indexes"] = require("./encoding-indexes.js")["encoding-indexes"];</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='diff-add'>(function(global) {</span>&nbsp; <span class='diff-add'> 'use strict';</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // Utilities</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {number} a The number to test.</span>&nbsp; <span class='diff-add'> * @param {number} min The minimum value in the range, inclusive.</span>&nbsp; <span class='diff-add'> * @param {number} max The maximum value in the range, inclusive.</span>&nbsp; <span class='diff-add'> * @return {boolean} True if a >= min and a <= max.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function inRange(a, min, max) {</span>&nbsp; <span class='diff-add'> return min <= a && a <= max;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {number} n The numerator.</span>&nbsp; <span class='diff-add'> * @param {number} d The denominator.</span>&nbsp; <span class='diff-add'> * @return {number} The result of the integer division of n by d.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function div(n, d) {</span>&nbsp; <span class='diff-add'> return Math.floor(n / d);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // Implementation of Encoding specification</span>&nbsp; <span class='diff-add'> // http://dvcs.w3.org/hg/encoding/raw-file/tip/Overview.html</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 3. Terminology</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 4. Encodings</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> /** @const */ var EOF_byte = -1;</span>&nbsp; <span class='diff-add'> /** @const */ var EOF_code_point = -1;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {Uint8Array} bytes Array of bytes that provide the stream.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function ByteInputStream(bytes) {</span>&nbsp; <span class='diff-add'> /** @type {number} */</span>&nbsp; <span class='diff-add'> var pos = 0;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @this {ByteInputStream}</span>&nbsp; <span class='diff-add'> * @return {number} Get the next byte from the stream.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.get = function() {</span>&nbsp; <span class='diff-add'> return (pos >= bytes.length) ? EOF_byte : Number(bytes[pos]);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {number} n Number (positive or negative) by which to</span>&nbsp; <span class='diff-add'> * offset the byte pointer. */</span>&nbsp; <span class='diff-add'> this.offset = function(n) {</span>&nbsp; <span class='diff-add'> pos += n;</span>&nbsp; <span class='diff-add'> if (pos < 0) {</span>&nbsp; <span class='diff-add'> throw new Error('Seeking past start of the buffer');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (pos > bytes.length) {</span>&nbsp; <span class='diff-add'> throw new Error('Seeking past EOF');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {Array.<number>} test Array of bytes to compare against.</span>&nbsp; <span class='diff-add'> * @return {boolean} True if the start of the stream matches the test</span>&nbsp; <span class='diff-add'> * bytes.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.match = function(test) {</span>&nbsp; <span class='diff-add'> if (test.length > pos + bytes.length) {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> for (i = 0; i < test.length; i += 1) {</span>&nbsp; <span class='diff-add'> if (Number(bytes[pos + i]) !== test[i]) {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {Array.<number>} bytes The array to write bytes into.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function ByteOutputStream(bytes) {</span>&nbsp; <span class='diff-add'> /** @type {number} */</span>&nbsp; <span class='diff-add'> var pos = 0;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {...number} var_args The byte or bytes to emit into the stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.emit = function(var_args) {</span>&nbsp; <span class='diff-add'> /** @type {number} */</span>&nbsp; <span class='diff-add'> var last = EOF_byte;</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> for (i = 0; i < arguments.length; ++i) {</span>&nbsp; <span class='diff-add'> last = Number(arguments[i]);</span>&nbsp; <span class='diff-add'> bytes[pos++] = last;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return last;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {string} string The source of code units for the stream.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function CodePointInputStream(string) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {string} string Input string of UTF-16 code units.</span>&nbsp; <span class='diff-add'> * @return {Array.<number>} Code points.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function stringToCodePoints(string) {</span>&nbsp; <span class='diff-add'> /** @type {Array.<number>} */</span>&nbsp; <span class='diff-add'> var cps = [];</span>&nbsp; <span class='diff-add'> // Based on http://www.w3.org/TR/WebIDL/#idl-DOMString</span>&nbsp; <span class='diff-add'> var i = 0, n = string.length;</span>&nbsp; <span class='diff-add'> while (i < string.length) {</span>&nbsp; <span class='diff-add'> var c = string.charCodeAt(i);</span>&nbsp; <span class='diff-add'> if (!inRange(c, 0xD800, 0xDFFF)) {</span>&nbsp; <span class='diff-add'> cps.push(c);</span>&nbsp; <span class='diff-add'> } else if (inRange(c, 0xDC00, 0xDFFF)) {</span>&nbsp; <span class='diff-add'> cps.push(0xFFFD);</span>&nbsp; <span class='diff-add'> } else { // (inRange(cu, 0xD800, 0xDBFF))</span>&nbsp; <span class='diff-add'> if (i === n - 1) {</span>&nbsp; <span class='diff-add'> cps.push(0xFFFD);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var d = string.charCodeAt(i + 1);</span>&nbsp; <span class='diff-add'> if (inRange(d, 0xDC00, 0xDFFF)) {</span>&nbsp; <span class='diff-add'> var a = c & 0x3FF;</span>&nbsp; <span class='diff-add'> var b = d & 0x3FF;</span>&nbsp; <span class='diff-add'> i += 1;</span>&nbsp; <span class='diff-add'> cps.push(0x10000 + (a << 10) + b);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> cps.push(0xFFFD);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> i += 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cps;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /** @type {number} */</span>&nbsp; <span class='diff-add'> var pos = 0;</span>&nbsp; <span class='diff-add'> /** @type {Array.<number>} */</span>&nbsp; <span class='diff-add'> var cps = stringToCodePoints(string);</span>&nbsp; <span class='diff-add'> /** @param {number} n The number of bytes (positive or negative)</span>&nbsp; <span class='diff-add'> * to advance the code point pointer by.*/</span>&nbsp; <span class='diff-add'> this.offset = function(n) {</span>&nbsp; <span class='diff-add'> pos += n;</span>&nbsp; <span class='diff-add'> if (pos < 0) {</span>&nbsp; <span class='diff-add'> throw new Error('Seeking past start of the buffer');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (pos > cps.length) {</span>&nbsp; <span class='diff-add'> throw new Error('Seeking past EOF');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @return {number} Get the next code point from the stream. */</span>&nbsp; <span class='diff-add'> this.get = function() {</span>&nbsp; <span class='diff-add'> if (pos >= cps.length) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cps[pos];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function CodePointOutputStream() {</span>&nbsp; <span class='diff-add'> /** @type {string} */</span>&nbsp; <span class='diff-add'> var string = '';</span>&nbsp; <span class='diff-add'> /** @return {string} The accumulated string. */</span>&nbsp; <span class='diff-add'> this.string = function() {</span>&nbsp; <span class='diff-add'> return string;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {number} c The code point to encode into the stream. */</span>&nbsp; <span class='diff-add'> this.emit = function(c) {</span>&nbsp; <span class='diff-add'> if (c <= 0xFFFF) {</span>&nbsp; <span class='diff-add'> string += String.fromCharCode(c);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> c -= 0x10000;</span>&nbsp; <span class='diff-add'> string += String.fromCharCode(0xD800 + ((c >> 10) & 0x3ff));</span>&nbsp; <span class='diff-add'> string += String.fromCharCode(0xDC00 + (c & 0x3ff));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {string} message Description of the error.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function EncodingError(message) {</span>&nbsp; <span class='diff-add'> this.name = 'EncodingError';</span>&nbsp; <span class='diff-add'> this.message = message;</span>&nbsp; <span class='diff-add'> this.code = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> EncodingError.prototype = Error.prototype;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {boolean} fatal If true, decoding errors raise an exception.</span>&nbsp; <span class='diff-add'> * @param {number=} opt_code_point Override the standard fallback code point.</span>&nbsp; <span class='diff-add'> * @return {number} The code point to insert on a decoding error.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function decoderError(fatal, opt_code_point) {</span>&nbsp; <span class='diff-add'> if (fatal) {</span>&nbsp; <span class='diff-add'> throw new EncodingError('Decoder error');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return opt_code_point || 0xFFFD;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {number} code_point The code point that could not be encoded.</span>&nbsp; <span class='diff-add'> * @return {number} Always throws, no value is actually returned.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function encoderError(code_point) {</span>&nbsp; <span class='diff-add'> throw new EncodingError('The code point ' + code_point +</span>&nbsp; <span class='diff-add'> ' could not be encoded.');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {string} label The encoding label.</span>&nbsp; <span class='diff-add'> * @return {?{name:string,labels:Array.<string>}}</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function getEncoding(label) {</span>&nbsp; <span class='diff-add'> label = String(label).trim().toLowerCase();</span>&nbsp; <span class='diff-add'> if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) {</span>&nbsp; <span class='diff-add'> return label_to_encoding[label];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /** @type {Array.<{encodings: Array.<{name:string,labels:Array.<string>}>,</span>&nbsp; <span class='diff-add'> * heading: string}>} */</span>&nbsp; <span class='diff-add'> var encodings = [</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "encodings": [</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "unicode-1-1-utf-8",</span>&nbsp; <span class='diff-add'> "utf-8",</span>&nbsp; <span class='diff-add'> "utf8"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "utf-8"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "heading": "The Encoding"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "encodings": [</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "866",</span>&nbsp; <span class='diff-add'> "cp866",</span>&nbsp; <span class='diff-add'> "csibm866",</span>&nbsp; <span class='diff-add'> "ibm866"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "ibm866"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csisolatin2",</span>&nbsp; <span class='diff-add'> "iso-8859-2",</span>&nbsp; <span class='diff-add'> "iso-ir-101",</span>&nbsp; <span class='diff-add'> "iso8859-2",</span>&nbsp; <span class='diff-add'> "iso88592",</span>&nbsp; <span class='diff-add'> "iso_8859-2",</span>&nbsp; <span class='diff-add'> "iso_8859-2:1987",</span>&nbsp; <span class='diff-add'> "l2",</span>&nbsp; <span class='diff-add'> "latin2"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-2"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csisolatin3",</span>&nbsp; <span class='diff-add'> "iso-8859-3",</span>&nbsp; <span class='diff-add'> "iso-ir-109",</span>&nbsp; <span class='diff-add'> "iso8859-3",</span>&nbsp; <span class='diff-add'> "iso88593",</span>&nbsp; <span class='diff-add'> "iso_8859-3",</span>&nbsp; <span class='diff-add'> "iso_8859-3:1988",</span>&nbsp; <span class='diff-add'> "l3",</span>&nbsp; <span class='diff-add'> "latin3"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-3"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csisolatin4",</span>&nbsp; <span class='diff-add'> "iso-8859-4",</span>&nbsp; <span class='diff-add'> "iso-ir-110",</span>&nbsp; <span class='diff-add'> "iso8859-4",</span>&nbsp; <span class='diff-add'> "iso88594",</span>&nbsp; <span class='diff-add'> "iso_8859-4",</span>&nbsp; <span class='diff-add'> "iso_8859-4:1988",</span>&nbsp; <span class='diff-add'> "l4",</span>&nbsp; <span class='diff-add'> "latin4"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-4"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csisolatincyrillic",</span>&nbsp; <span class='diff-add'> "cyrillic",</span>&nbsp; <span class='diff-add'> "iso-8859-5",</span>&nbsp; <span class='diff-add'> "iso-ir-144",</span>&nbsp; <span class='diff-add'> "iso8859-5",</span>&nbsp; <span class='diff-add'> "iso88595",</span>&nbsp; <span class='diff-add'> "iso_8859-5",</span>&nbsp; <span class='diff-add'> "iso_8859-5:1988"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-5"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "arabic",</span>&nbsp; <span class='diff-add'> "asmo-708",</span>&nbsp; <span class='diff-add'> "csiso88596e",</span>&nbsp; <span class='diff-add'> "csiso88596i",</span>&nbsp; <span class='diff-add'> "csisolatinarabic",</span>&nbsp; <span class='diff-add'> "ecma-114",</span>&nbsp; <span class='diff-add'> "iso-8859-6",</span>&nbsp; <span class='diff-add'> "iso-8859-6-e",</span>&nbsp; <span class='diff-add'> "iso-8859-6-i",</span>&nbsp; <span class='diff-add'> "iso-ir-127",</span>&nbsp; <span class='diff-add'> "iso8859-6",</span>&nbsp; <span class='diff-add'> "iso88596",</span>&nbsp; <span class='diff-add'> "iso_8859-6",</span>&nbsp; <span class='diff-add'> "iso_8859-6:1987"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-6"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csisolatingreek",</span>&nbsp; <span class='diff-add'> "ecma-118",</span>&nbsp; <span class='diff-add'> "elot_928",</span>&nbsp; <span class='diff-add'> "greek",</span>&nbsp; <span class='diff-add'> "greek8",</span>&nbsp; <span class='diff-add'> "iso-8859-7",</span>&nbsp; <span class='diff-add'> "iso-ir-126",</span>&nbsp; <span class='diff-add'> "iso8859-7",</span>&nbsp; <span class='diff-add'> "iso88597",</span>&nbsp; <span class='diff-add'> "iso_8859-7",</span>&nbsp; <span class='diff-add'> "iso_8859-7:1987",</span>&nbsp; <span class='diff-add'> "sun_eu_greek"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-7"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csiso88598e",</span>&nbsp; <span class='diff-add'> "csisolatinhebrew",</span>&nbsp; <span class='diff-add'> "hebrew",</span>&nbsp; <span class='diff-add'> "iso-8859-8",</span>&nbsp; <span class='diff-add'> "iso-8859-8-e",</span>&nbsp; <span class='diff-add'> "iso-ir-138",</span>&nbsp; <span class='diff-add'> "iso8859-8",</span>&nbsp; <span class='diff-add'> "iso88598",</span>&nbsp; <span class='diff-add'> "iso_8859-8",</span>&nbsp; <span class='diff-add'> "iso_8859-8:1988",</span>&nbsp; <span class='diff-add'> "visual"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-8"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csiso88598i",</span>&nbsp; <span class='diff-add'> "iso-8859-8-i",</span>&nbsp; <span class='diff-add'> "logical"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-8-i"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csisolatin6",</span>&nbsp; <span class='diff-add'> "iso-8859-10",</span>&nbsp; <span class='diff-add'> "iso-ir-157",</span>&nbsp; <span class='diff-add'> "iso8859-10",</span>&nbsp; <span class='diff-add'> "iso885910",</span>&nbsp; <span class='diff-add'> "l6",</span>&nbsp; <span class='diff-add'> "latin6"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-10"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "iso-8859-13",</span>&nbsp; <span class='diff-add'> "iso8859-13",</span>&nbsp; <span class='diff-add'> "iso885913"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-13"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "iso-8859-14",</span>&nbsp; <span class='diff-add'> "iso8859-14",</span>&nbsp; <span class='diff-add'> "iso885914"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-14"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csisolatin9",</span>&nbsp; <span class='diff-add'> "iso-8859-15",</span>&nbsp; <span class='diff-add'> "iso8859-15",</span>&nbsp; <span class='diff-add'> "iso885915",</span>&nbsp; <span class='diff-add'> "iso_8859-15",</span>&nbsp; <span class='diff-add'> "l9"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-15"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "iso-8859-16"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-8859-16"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "cskoi8r",</span>&nbsp; <span class='diff-add'> "koi",</span>&nbsp; <span class='diff-add'> "koi8",</span>&nbsp; <span class='diff-add'> "koi8-r",</span>&nbsp; <span class='diff-add'> "koi8_r"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "koi8-r"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "koi8-u"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "koi8-u"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csmacintosh",</span>&nbsp; <span class='diff-add'> "mac",</span>&nbsp; <span class='diff-add'> "macintosh",</span>&nbsp; <span class='diff-add'> "x-mac-roman"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "macintosh"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "dos-874",</span>&nbsp; <span class='diff-add'> "iso-8859-11",</span>&nbsp; <span class='diff-add'> "iso8859-11",</span>&nbsp; <span class='diff-add'> "iso885911",</span>&nbsp; <span class='diff-add'> "tis-620",</span>&nbsp; <span class='diff-add'> "windows-874"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "windows-874"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "cp1250",</span>&nbsp; <span class='diff-add'> "windows-1250",</span>&nbsp; <span class='diff-add'> "x-cp1250"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "windows-1250"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "cp1251",</span>&nbsp; <span class='diff-add'> "windows-1251",</span>&nbsp; <span class='diff-add'> "x-cp1251"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "windows-1251"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "ansi_x3.4-1968",</span>&nbsp; <span class='diff-add'> "ascii",</span>&nbsp; <span class='diff-add'> "cp1252",</span>&nbsp; <span class='diff-add'> "cp819",</span>&nbsp; <span class='diff-add'> "csisolatin1",</span>&nbsp; <span class='diff-add'> "ibm819",</span>&nbsp; <span class='diff-add'> "iso-8859-1",</span>&nbsp; <span class='diff-add'> "iso-ir-100",</span>&nbsp; <span class='diff-add'> "iso8859-1",</span>&nbsp; <span class='diff-add'> "iso88591",</span>&nbsp; <span class='diff-add'> "iso_8859-1",</span>&nbsp; <span class='diff-add'> "iso_8859-1:1987",</span>&nbsp; <span class='diff-add'> "l1",</span>&nbsp; <span class='diff-add'> "latin1",</span>&nbsp; <span class='diff-add'> "us-ascii",</span>&nbsp; <span class='diff-add'> "windows-1252",</span>&nbsp; <span class='diff-add'> "x-cp1252"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "windows-1252"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "cp1253",</span>&nbsp; <span class='diff-add'> "windows-1253",</span>&nbsp; <span class='diff-add'> "x-cp1253"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "windows-1253"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "cp1254",</span>&nbsp; <span class='diff-add'> "csisolatin5",</span>&nbsp; <span class='diff-add'> "iso-8859-9",</span>&nbsp; <span class='diff-add'> "iso-ir-148",</span>&nbsp; <span class='diff-add'> "iso8859-9",</span>&nbsp; <span class='diff-add'> "iso88599",</span>&nbsp; <span class='diff-add'> "iso_8859-9",</span>&nbsp; <span class='diff-add'> "iso_8859-9:1989",</span>&nbsp; <span class='diff-add'> "l5",</span>&nbsp; <span class='diff-add'> "latin5",</span>&nbsp; <span class='diff-add'> "windows-1254",</span>&nbsp; <span class='diff-add'> "x-cp1254"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "windows-1254"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "cp1255",</span>&nbsp; <span class='diff-add'> "windows-1255",</span>&nbsp; <span class='diff-add'> "x-cp1255"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "windows-1255"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "cp1256",</span>&nbsp; <span class='diff-add'> "windows-1256",</span>&nbsp; <span class='diff-add'> "x-cp1256"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "windows-1256"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "cp1257",</span>&nbsp; <span class='diff-add'> "windows-1257",</span>&nbsp; <span class='diff-add'> "x-cp1257"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "windows-1257"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "cp1258",</span>&nbsp; <span class='diff-add'> "windows-1258",</span>&nbsp; <span class='diff-add'> "x-cp1258"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "windows-1258"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "x-mac-cyrillic",</span>&nbsp; <span class='diff-add'> "x-mac-ukrainian"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "x-mac-cyrillic"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "heading": "Legacy single-byte encodings"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "encodings": [</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "chinese",</span>&nbsp; <span class='diff-add'> "csgb2312",</span>&nbsp; <span class='diff-add'> "csiso58gb231280",</span>&nbsp; <span class='diff-add'> "gb18030",</span>&nbsp; <span class='diff-add'> "gb2312",</span>&nbsp; <span class='diff-add'> "gb_2312",</span>&nbsp; <span class='diff-add'> "gb_2312-80",</span>&nbsp; <span class='diff-add'> "gbk",</span>&nbsp; <span class='diff-add'> "iso-ir-58",</span>&nbsp; <span class='diff-add'> "x-gbk"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "gb18030"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "hz-gb-2312"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "hz-gb-2312"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "heading": "Legacy multi-byte Chinese (simplified) encodings"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "encodings": [</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "big5",</span>&nbsp; <span class='diff-add'> "big5-hkscs",</span>&nbsp; <span class='diff-add'> "cn-big5",</span>&nbsp; <span class='diff-add'> "csbig5",</span>&nbsp; <span class='diff-add'> "x-x-big5"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "big5"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "heading": "Legacy multi-byte Chinese (traditional) encodings"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "encodings": [</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "cseucpkdfmtjapanese",</span>&nbsp; <span class='diff-add'> "euc-jp",</span>&nbsp; <span class='diff-add'> "x-euc-jp"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "euc-jp"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csiso2022jp",</span>&nbsp; <span class='diff-add'> "iso-2022-jp"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "iso-2022-jp"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csshiftjis",</span>&nbsp; <span class='diff-add'> "ms_kanji",</span>&nbsp; <span class='diff-add'> "shift-jis",</span>&nbsp; <span class='diff-add'> "shift_jis",</span>&nbsp; <span class='diff-add'> "sjis",</span>&nbsp; <span class='diff-add'> "windows-31j",</span>&nbsp; <span class='diff-add'> "x-sjis"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "shift_jis"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "heading": "Legacy multi-byte Japanese encodings"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "encodings": [</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "cseuckr",</span>&nbsp; <span class='diff-add'> "csksc56011987",</span>&nbsp; <span class='diff-add'> "euc-kr",</span>&nbsp; <span class='diff-add'> "iso-ir-149",</span>&nbsp; <span class='diff-add'> "korean",</span>&nbsp; <span class='diff-add'> "ks_c_5601-1987",</span>&nbsp; <span class='diff-add'> "ks_c_5601-1989",</span>&nbsp; <span class='diff-add'> "ksc5601",</span>&nbsp; <span class='diff-add'> "ksc_5601",</span>&nbsp; <span class='diff-add'> "windows-949"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "euc-kr"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "heading": "Legacy multi-byte Korean encodings"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "encodings": [</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "csiso2022kr",</span>&nbsp; <span class='diff-add'> "iso-2022-cn",</span>&nbsp; <span class='diff-add'> "iso-2022-cn-ext",</span>&nbsp; <span class='diff-add'> "iso-2022-kr"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "replacement"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "utf-16be"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "utf-16be"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "utf-16",</span>&nbsp; <span class='diff-add'> "utf-16le"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "utf-16le"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "labels": [</span>&nbsp; <span class='diff-add'> "x-user-defined"</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "name": "x-user-defined"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> "heading": "Legacy miscellaneous encodings"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ];</span>&nbsp; <span class='diff-add'> var name_to_encoding = {};</span>&nbsp; <span class='diff-add'> var label_to_encoding = {};</span>&nbsp; <span class='diff-add'> encodings.forEach(function(category) {</span>&nbsp; <span class='diff-add'> category['encodings'].forEach(function(encoding) {</span>&nbsp; <span class='diff-add'> name_to_encoding[encoding['name']] = encoding;</span>&nbsp; <span class='diff-add'> encoding['labels'].forEach(function(label) {</span>&nbsp; <span class='diff-add'> label_to_encoding[label] = encoding;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 5. Indexes</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {number} pointer The |pointer| to search for.</span>&nbsp; <span class='diff-add'> * @param {Array.<?number>|undefined} index The |index| to search within.</span>&nbsp; <span class='diff-add'> * @return {?number} The code point corresponding to |pointer| in |index|,</span>&nbsp; <span class='diff-add'> * or null if |code point| is not in |index|.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function indexCodePointFor(pointer, index) {</span>&nbsp; <span class='diff-add'> if (!index) return null;</span>&nbsp; <span class='diff-add'> return index[pointer] || null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {number} code_point The |code point| to search for.</span>&nbsp; <span class='diff-add'> * @param {Array.<?number>} index The |index| to search within.</span>&nbsp; <span class='diff-add'> * @return {?number} The first pointer corresponding to |code point| in</span>&nbsp; <span class='diff-add'> * |index|, or null if |code point| is not in |index|.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function indexPointerFor(code_point, index) {</span>&nbsp; <span class='diff-add'> var pointer = index.indexOf(code_point);</span>&nbsp; <span class='diff-add'> return pointer === -1 ? null : pointer;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {string} name Name of the index.</span>&nbsp; <span class='diff-add'> * @return {(Array.<number>|Array.<Array.<number>>)}</span>&nbsp; <span class='diff-add'> * */</span>&nbsp; <span class='diff-add'> function index(name) {</span>&nbsp; <span class='diff-add'> if (!('encoding-indexes' in global))</span>&nbsp; <span class='diff-add'> throw new Error("Indexes missing. Did you forget to include encoding-indexes.js?");</span>&nbsp; <span class='diff-add'> return global['encoding-indexes'][name];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {number} pointer The |pointer| to search for in the gb18030 index.</span>&nbsp; <span class='diff-add'> * @return {?number} The code point corresponding to |pointer| in |index|,</span>&nbsp; <span class='diff-add'> * or null if |code point| is not in the gb18030 index.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function indexGB18030CodePointFor(pointer) {</span>&nbsp; <span class='diff-add'> if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575)) {</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var /** @type {number} */ offset = 0,</span>&nbsp; <span class='diff-add'> /** @type {number} */ code_point_offset = 0,</span>&nbsp; <span class='diff-add'> /** @type {Array.<Array.<number>>} */ idx = index('gb18030');</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> for (i = 0; i < idx.length; ++i) {</span>&nbsp; <span class='diff-add'> var entry = idx[i];</span>&nbsp; <span class='diff-add'> if (entry[0] <= pointer) {</span>&nbsp; <span class='diff-add'> offset = entry[0];</span>&nbsp; <span class='diff-add'> code_point_offset = entry[1];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point_offset + pointer - offset;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {number} code_point The |code point| to locate in the gb18030 index.</span>&nbsp; <span class='diff-add'> * @return {number} The first pointer corresponding to |code point| in the</span>&nbsp; <span class='diff-add'> * gb18030 index.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function indexGB18030PointerFor(code_point) {</span>&nbsp; <span class='diff-add'> var /** @type {number} */ offset = 0,</span>&nbsp; <span class='diff-add'> /** @type {number} */ pointer_offset = 0,</span>&nbsp; <span class='diff-add'> /** @type {Array.<Array.<number>>} */ idx = index('gb18030');</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> for (i = 0; i < idx.length; ++i) {</span>&nbsp; <span class='diff-add'> var entry = idx[i];</span>&nbsp; <span class='diff-add'> if (entry[1] <= code_point) {</span>&nbsp; <span class='diff-add'> offset = entry[1];</span>&nbsp; <span class='diff-add'> pointer_offset = entry[0];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return pointer_offset + code_point - offset;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 7. API</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> /** @const */ var DEFAULT_ENCODING = 'utf-8';</span>&nbsp; <span class='diff-add'> // 7.1 Interface TextDecoder</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {string=} opt_encoding The label of the encoding;</span>&nbsp; <span class='diff-add'> * defaults to 'utf-8'.</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}=} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function TextDecoder(opt_encoding, options) {</span>&nbsp; <span class='diff-add'> if (!(this instanceof TextDecoder)) {</span>&nbsp; <span class='diff-add'> return new TextDecoder(opt_encoding, options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> opt_encoding = opt_encoding ? String(opt_encoding) : DEFAULT_ENCODING;</span>&nbsp; <span class='diff-add'> options = Object(options);</span>&nbsp; <span class='diff-add'> /** @private */</span>&nbsp; <span class='diff-add'> this._encoding = getEncoding(opt_encoding);</span>&nbsp; <span class='diff-add'> if (this._encoding === null || this._encoding.name === 'replacement')</span>&nbsp; <span class='diff-add'> throw new TypeError('Unknown encoding: ' + opt_encoding);</span>&nbsp; <span class='diff-add'> if (!this._encoding.getDecoder)</span>&nbsp; <span class='diff-add'> throw new Error('Decoder not present. Did you forget to include encoding-indexes.js?');</span>&nbsp; <span class='diff-add'> /** @private @type {boolean} */</span>&nbsp; <span class='diff-add'> this._streaming = false;</span>&nbsp; <span class='diff-add'> /** @private @type {boolean} */</span>&nbsp; <span class='diff-add'> this._BOMseen = false;</span>&nbsp; <span class='diff-add'> /** @private */</span>&nbsp; <span class='diff-add'> this._decoder = null;</span>&nbsp; <span class='diff-add'> /** @private @type {{fatal: boolean}=} */</span>&nbsp; <span class='diff-add'> this._options = { fatal: Boolean(options.fatal) };</span>&nbsp; <span class='diff-add'> if (Object.defineProperty) {</span>&nbsp; <span class='diff-add'> Object.defineProperty(</span>&nbsp; <span class='diff-add'> this, 'encoding',</span>&nbsp; <span class='diff-add'> { get: function() { return this._encoding.name; } });</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.encoding = this._encoding.name;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // TODO: Issue if input byte stream is offset by decoder</span>&nbsp; <span class='diff-add'> // TODO: BOM detection will not work if stream header spans multiple calls</span>&nbsp; <span class='diff-add'> // (last N bytes of previous stream may need to be retained?)</span>&nbsp; <span class='diff-add'> TextDecoder.prototype = {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ArrayBufferView=} opt_view The buffer of bytes to decode.</span>&nbsp; <span class='diff-add'> * @param {{stream: boolean}=} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> decode: function decode(opt_view, options) {</span>&nbsp; <span class='diff-add'> if (opt_view && !('buffer' in opt_view && 'byteOffset' in opt_view &&</span>&nbsp; <span class='diff-add'> 'byteLength' in opt_view)) {</span>&nbsp; <span class='diff-add'> throw new TypeError('Expected ArrayBufferView');</span>&nbsp; <span class='diff-add'> } else if (!opt_view) {</span>&nbsp; <span class='diff-add'> opt_view = new Uint8Array(0);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> options = Object(options);</span>&nbsp; <span class='diff-add'> if (!this._streaming) {</span>&nbsp; <span class='diff-add'> this._decoder = this._encoding.getDecoder(this._options);</span>&nbsp; <span class='diff-add'> this._BOMseen = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._streaming = Boolean(options.stream);</span>&nbsp; <span class='diff-add'> var bytes = new Uint8Array(opt_view.buffer,</span>&nbsp; <span class='diff-add'> opt_view.byteOffset,</span>&nbsp; <span class='diff-add'> opt_view.byteLength);</span>&nbsp; <span class='diff-add'> var input_stream = new ByteInputStream(bytes);</span>&nbsp; <span class='diff-add'> var output_stream = new CodePointOutputStream();</span>&nbsp; <span class='diff-add'> /** @type {number} */</span>&nbsp; <span class='diff-add'> var code_point;</span>&nbsp; <span class='diff-add'> while (input_stream.get() !== EOF_byte) {</span>&nbsp; <span class='diff-add'> code_point = this._decoder.decode(input_stream);</span>&nbsp; <span class='diff-add'> if (code_point !== null && code_point !== EOF_code_point) {</span>&nbsp; <span class='diff-add'> output_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!this._streaming) {</span>&nbsp; <span class='diff-add'> do {</span>&nbsp; <span class='diff-add'> code_point = this._decoder.decode(input_stream);</span>&nbsp; <span class='diff-add'> if (code_point !== null && code_point !== EOF_code_point) {</span>&nbsp; <span class='diff-add'> output_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } while (code_point !== EOF_code_point &&</span>&nbsp; <span class='diff-add'> input_stream.get() != EOF_byte);</span>&nbsp; <span class='diff-add'> this._decoder = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var result = output_stream.string();</span>&nbsp; <span class='diff-add'> if (!this._BOMseen && result.length) {</span>&nbsp; <span class='diff-add'> this._BOMseen = true;</span>&nbsp; <span class='diff-add'> if (['utf-8', 'utf-16le', 'utf-16be'].indexOf(this.encoding) !== -1 &&</span>&nbsp; <span class='diff-add'> result.charCodeAt(0) === 0xFEFF) {</span>&nbsp; <span class='diff-add'> result = result.substring(1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // 7.2 Interface TextEncoder</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {string=} opt_encoding The label of the encoding;</span>&nbsp; <span class='diff-add'> * defaults to 'utf-8'.</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}=} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function TextEncoder(opt_encoding, options) {</span>&nbsp; <span class='diff-add'> if (!(this instanceof TextEncoder)) {</span>&nbsp; <span class='diff-add'> return new TextEncoder(opt_encoding, options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> opt_encoding = opt_encoding ? String(opt_encoding) : DEFAULT_ENCODING;</span>&nbsp; <span class='diff-add'> options = Object(options);</span>&nbsp; <span class='diff-add'> /** @private */</span>&nbsp; <span class='diff-add'> this._encoding = getEncoding(opt_encoding);</span>&nbsp; <span class='diff-add'> var allowLegacyEncoding = options.NONSTANDARD_allowLegacyEncoding;</span>&nbsp; <span class='diff-add'> var isLegacyEncoding = (this._encoding.name !== 'utf-8' &&</span>&nbsp; <span class='diff-add'> this._encoding.name !== 'utf-16le' &&</span>&nbsp; <span class='diff-add'> this._encoding.name !== 'utf-16be');</span>&nbsp; <span class='diff-add'> if (this._encoding === null || (isLegacyEncoding && !allowLegacyEncoding))</span>&nbsp; <span class='diff-add'> throw new TypeError('Unknown encoding: ' + opt_encoding);</span>&nbsp; <span class='diff-add'> if (!this._encoding.getEncoder)</span>&nbsp; <span class='diff-add'> throw new Error('Encoder not present. Did you forget to include encoding-indexes.js?');</span>&nbsp; <span class='diff-add'> /** @private @type {boolean} */</span>&nbsp; <span class='diff-add'> this._streaming = false;</span>&nbsp; <span class='diff-add'> /** @private */</span>&nbsp; <span class='diff-add'> this._encoder = null;</span>&nbsp; <span class='diff-add'> /** @private @type {{fatal: boolean}=} */</span>&nbsp; <span class='diff-add'> this._options = { fatal: Boolean(options.fatal) };</span>&nbsp; <span class='diff-add'> if (Object.defineProperty) {</span>&nbsp; <span class='diff-add'> Object.defineProperty(</span>&nbsp; <span class='diff-add'> this, 'encoding',</span>&nbsp; <span class='diff-add'> { get: function() { return this._encoding.name; } });</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.encoding = this._encoding.name;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> TextEncoder.prototype = {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {string=} opt_string The string to encode.</span>&nbsp; <span class='diff-add'> * @param {{stream: boolean}=} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> encode: function encode(opt_string, options) {</span>&nbsp; <span class='diff-add'> opt_string = opt_string ? String(opt_string) : '';</span>&nbsp; <span class='diff-add'> options = Object(options);</span>&nbsp; <span class='diff-add'> // TODO: any options?</span>&nbsp; <span class='diff-add'> if (!this._streaming) {</span>&nbsp; <span class='diff-add'> this._encoder = this._encoding.getEncoder(this._options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._streaming = Boolean(options.stream);</span>&nbsp; <span class='diff-add'> var bytes = [];</span>&nbsp; <span class='diff-add'> var output_stream = new ByteOutputStream(bytes);</span>&nbsp; <span class='diff-add'> var input_stream = new CodePointInputStream(opt_string);</span>&nbsp; <span class='diff-add'> while (input_stream.get() !== EOF_code_point) {</span>&nbsp; <span class='diff-add'> this._encoder.encode(output_stream, input_stream);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!this._streaming) {</span>&nbsp; <span class='diff-add'> /** @type {number} */</span>&nbsp; <span class='diff-add'> var last_byte;</span>&nbsp; <span class='diff-add'> do {</span>&nbsp; <span class='diff-add'> last_byte = this._encoder.encode(output_stream, input_stream);</span>&nbsp; <span class='diff-add'> } while (last_byte !== EOF_byte);</span>&nbsp; <span class='diff-add'> this._encoder = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return new Uint8Array(bytes);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 8. The encoding</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 8.1 utf-8</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function UTF8Decoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> var /** @type {number} */ utf8_code_point = 0,</span>&nbsp; <span class='diff-add'> /** @type {number} */ utf8_bytes_needed = 0,</span>&nbsp; <span class='diff-add'> /** @type {number} */ utf8_bytes_seen = 0,</span>&nbsp; <span class='diff-add'> /** @type {number} */ utf8_lower_boundary = 0;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span>&nbsp; <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span>&nbsp; <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.decode = function(byte_pointer) {</span>&nbsp; <span class='diff-add'> var bite = byte_pointer.get();</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte) {</span>&nbsp; <span class='diff-add'> if (utf8_bytes_needed !== 0) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (utf8_bytes_needed === 0) {</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span>&nbsp; <span class='diff-add'> return bite;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0xC2, 0xDF)) {</span>&nbsp; <span class='diff-add'> utf8_bytes_needed = 1;</span>&nbsp; <span class='diff-add'> utf8_lower_boundary = 0x80;</span>&nbsp; <span class='diff-add'> utf8_code_point = bite - 0xC0;</span>&nbsp; <span class='diff-add'> } else if (inRange(bite, 0xE0, 0xEF)) {</span>&nbsp; <span class='diff-add'> utf8_bytes_needed = 2;</span>&nbsp; <span class='diff-add'> utf8_lower_boundary = 0x800;</span>&nbsp; <span class='diff-add'> utf8_code_point = bite - 0xE0;</span>&nbsp; <span class='diff-add'> } else if (inRange(bite, 0xF0, 0xF4)) {</span>&nbsp; <span class='diff-add'> utf8_bytes_needed = 3;</span>&nbsp; <span class='diff-add'> utf8_lower_boundary = 0x10000;</span>&nbsp; <span class='diff-add'> utf8_code_point = bite - 0xF0;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed);</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!inRange(bite, 0x80, 0xBF)) {</span>&nbsp; <span class='diff-add'> utf8_code_point = 0;</span>&nbsp; <span class='diff-add'> utf8_bytes_needed = 0;</span>&nbsp; <span class='diff-add'> utf8_bytes_seen = 0;</span>&nbsp; <span class='diff-add'> utf8_lower_boundary = 0;</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> utf8_bytes_seen += 1;</span>&nbsp; <span class='diff-add'> utf8_code_point = utf8_code_point + (bite - 0x80) *</span>&nbsp; <span class='diff-add'> Math.pow(64, utf8_bytes_needed - utf8_bytes_seen);</span>&nbsp; <span class='diff-add'> if (utf8_bytes_seen !== utf8_bytes_needed) {</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var code_point = utf8_code_point;</span>&nbsp; <span class='diff-add'> var lower_boundary = utf8_lower_boundary;</span>&nbsp; <span class='diff-add'> utf8_code_point = 0;</span>&nbsp; <span class='diff-add'> utf8_bytes_needed = 0;</span>&nbsp; <span class='diff-add'> utf8_bytes_seen = 0;</span>&nbsp; <span class='diff-add'> utf8_lower_boundary = 0;</span>&nbsp; <span class='diff-add'> if (inRange(code_point, lower_boundary, 0x10FFFF) &&</span>&nbsp; <span class='diff-add'> !inRange(code_point, 0xD800, 0xDFFF)) {</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function UTF8Encoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span>&nbsp; <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span>&nbsp; <span class='diff-add'> /** @type {number} */</span>&nbsp; <span class='diff-add'> var code_point = code_point_pointer.get();</span>&nbsp; <span class='diff-add'> if (code_point === EOF_code_point) {</span>&nbsp; <span class='diff-add'> return EOF_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0xD800, 0xDFFF)) {</span>&nbsp; <span class='diff-add'> return encoderError(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007f)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var count, offset;</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0080, 0x07FF)) {</span>&nbsp; <span class='diff-add'> count = 1;</span>&nbsp; <span class='diff-add'> offset = 0xC0;</span>&nbsp; <span class='diff-add'> } else if (inRange(code_point, 0x0800, 0xFFFF)) {</span>&nbsp; <span class='diff-add'> count = 2;</span>&nbsp; <span class='diff-add'> offset = 0xE0;</span>&nbsp; <span class='diff-add'> } else if (inRange(code_point, 0x10000, 0x10FFFF)) {</span>&nbsp; <span class='diff-add'> count = 3;</span>&nbsp; <span class='diff-add'> offset = 0xF0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var result = output_byte_stream.emit(</span>&nbsp; <span class='diff-add'> div(code_point, Math.pow(64, count)) + offset);</span>&nbsp; <span class='diff-add'> while (count > 0) {</span>&nbsp; <span class='diff-add'> var temp = div(code_point, Math.pow(64, count - 1));</span>&nbsp; <span class='diff-add'> result = output_byte_stream.emit(0x80 + (temp % 64));</span>&nbsp; <span class='diff-add'> count -= 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['utf-8'].getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new UTF8Encoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['utf-8'].getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new UTF8Decoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 9. Legacy single-byte encodings</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {Array.<number>} index The encoding index.</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function SingleByteDecoder(index, options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span>&nbsp; <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span>&nbsp; <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.decode = function(byte_pointer) {</span>&nbsp; <span class='diff-add'> var bite = byte_pointer.get();</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span>&nbsp; <span class='diff-add'> return bite;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var code_point = index[bite - 0x80];</span>&nbsp; <span class='diff-add'> if (code_point === null) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {Array.<?number>} index The encoding index.</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function SingleByteEncoder(index, options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span>&nbsp; <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span>&nbsp; <span class='diff-add'> var code_point = code_point_pointer.get();</span>&nbsp; <span class='diff-add'> if (code_point === EOF_code_point) {</span>&nbsp; <span class='diff-add'> return EOF_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var pointer = indexPointerFor(code_point, index);</span>&nbsp; <span class='diff-add'> if (pointer === null) {</span>&nbsp; <span class='diff-add'> encoderError(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(pointer + 0x80);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> (function() {</span>&nbsp; <span class='diff-add'> if (!('encoding-indexes' in global))</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> encodings.forEach(function(category) {</span>&nbsp; <span class='diff-add'> if (category['heading'] !== 'Legacy single-byte encodings')</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> category['encodings'].forEach(function(encoding) {</span>&nbsp; <span class='diff-add'> var idx = index(encoding['name']);</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> encoding.getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new SingleByteDecoder(idx, options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> encoding.getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new SingleByteEncoder(idx, options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }());</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 10. Legacy multi-byte Chinese (simplified) encodings</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 9.1 gb18030</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function GB18030Decoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> var /** @type {number} */ gb18030_first = 0x00,</span>&nbsp; <span class='diff-add'> /** @type {number} */ gb18030_second = 0x00,</span>&nbsp; <span class='diff-add'> /** @type {number} */ gb18030_third = 0x00;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span>&nbsp; <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span>&nbsp; <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.decode = function(byte_pointer) {</span>&nbsp; <span class='diff-add'> var bite = byte_pointer.get();</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte && gb18030_first === 0x00 &&</span>&nbsp; <span class='diff-add'> gb18030_second === 0x00 && gb18030_third === 0x00) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte &&</span>&nbsp; <span class='diff-add'> (gb18030_first !== 0x00 || gb18030_second !== 0x00 || gb18030_third !== 0x00)) {</span>&nbsp; <span class='diff-add'> gb18030_first = 0x00;</span>&nbsp; <span class='diff-add'> gb18030_second = 0x00;</span>&nbsp; <span class='diff-add'> gb18030_third = 0x00;</span>&nbsp; <span class='diff-add'> decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(1);</span>&nbsp; <span class='diff-add'> var code_point;</span>&nbsp; <span class='diff-add'> if (gb18030_third !== 0x00) {</span>&nbsp; <span class='diff-add'> code_point = null;</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x30, 0x39)) {</span>&nbsp; <span class='diff-add'> code_point = indexGB18030CodePointFor(</span>&nbsp; <span class='diff-add'> (((gb18030_first - 0x81) * 10 + (gb18030_second - 0x30)) * 126 +</span>&nbsp; <span class='diff-add'> (gb18030_third - 0x81)) * 10 + bite - 0x30);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> gb18030_first = 0x00;</span>&nbsp; <span class='diff-add'> gb18030_second = 0x00;</span>&nbsp; <span class='diff-add'> gb18030_third = 0x00;</span>&nbsp; <span class='diff-add'> if (code_point === null) {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-3);</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (gb18030_second !== 0x00) {</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x81, 0xFE)) {</span>&nbsp; <span class='diff-add'> gb18030_third = bite;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-2);</span>&nbsp; <span class='diff-add'> gb18030_first = 0x00;</span>&nbsp; <span class='diff-add'> gb18030_second = 0x00;</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (gb18030_first !== 0x00) {</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x30, 0x39)) {</span>&nbsp; <span class='diff-add'> gb18030_second = bite;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lead = gb18030_first;</span>&nbsp; <span class='diff-add'> var pointer = null;</span>&nbsp; <span class='diff-add'> gb18030_first = 0x00;</span>&nbsp; <span class='diff-add'> var offset = bite < 0x7F ? 0x40 : 0x41;</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE)) {</span>&nbsp; <span class='diff-add'> pointer = (lead - 0x81) * 190 + (bite - offset);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point = pointer === null ? null :</span>&nbsp; <span class='diff-add'> indexCodePointFor(pointer, index('gb18030'));</span>&nbsp; <span class='diff-add'> if (pointer === null) {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === null) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span>&nbsp; <span class='diff-add'> return bite;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === 0x80) {</span>&nbsp; <span class='diff-add'> return 0x20AC;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x81, 0xFE)) {</span>&nbsp; <span class='diff-add'> gb18030_first = bite;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function GB18030Encoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span>&nbsp; <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span>&nbsp; <span class='diff-add'> var code_point = code_point_pointer.get();</span>&nbsp; <span class='diff-add'> if (code_point === EOF_code_point) {</span>&nbsp; <span class='diff-add'> return EOF_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var pointer = indexPointerFor(code_point, index('gb18030'));</span>&nbsp; <span class='diff-add'> if (pointer !== null) {</span>&nbsp; <span class='diff-add'> var lead = div(pointer, 190) + 0x81;</span>&nbsp; <span class='diff-add'> var trail = pointer % 190;</span>&nbsp; <span class='diff-add'> var offset = trail < 0x3F ? 0x40 : 0x41;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(lead, trail + offset);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> pointer = indexGB18030PointerFor(code_point);</span>&nbsp; <span class='diff-add'> var byte1 = div(div(div(pointer, 10), 126), 10);</span>&nbsp; <span class='diff-add'> pointer = pointer - byte1 * 10 * 126 * 10;</span>&nbsp; <span class='diff-add'> var byte2 = div(div(pointer, 10), 126);</span>&nbsp; <span class='diff-add'> pointer = pointer - byte2 * 10 * 126;</span>&nbsp; <span class='diff-add'> var byte3 = div(pointer, 10);</span>&nbsp; <span class='diff-add'> var byte4 = pointer - byte3 * 10;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(byte1 + 0x81,</span>&nbsp; <span class='diff-add'> byte2 + 0x30,</span>&nbsp; <span class='diff-add'> byte3 + 0x81,</span>&nbsp; <span class='diff-add'> byte4 + 0x30);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['gb18030'].getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new GB18030Encoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['gb18030'].getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new GB18030Decoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // 10.2 hz-gb-2312</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function HZGB2312Decoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> var /** @type {boolean} */ hzgb2312 = false,</span>&nbsp; <span class='diff-add'> /** @type {number} */ hzgb2312_lead = 0x00;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span>&nbsp; <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span>&nbsp; <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.decode = function(byte_pointer) {</span>&nbsp; <span class='diff-add'> var bite = byte_pointer.get();</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte && hzgb2312_lead === 0x00) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte && hzgb2312_lead !== 0x00) {</span>&nbsp; <span class='diff-add'> hzgb2312_lead = 0x00;</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (hzgb2312_lead === 0x7E) {</span>&nbsp; <span class='diff-add'> hzgb2312_lead = 0x00;</span>&nbsp; <span class='diff-add'> if (bite === 0x7B) {</span>&nbsp; <span class='diff-add'> hzgb2312 = true;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === 0x7D) {</span>&nbsp; <span class='diff-add'> hzgb2312 = false;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === 0x7E) {</span>&nbsp; <span class='diff-add'> return 0x007E;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === 0x0A) {</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (hzgb2312_lead !== 0x00) {</span>&nbsp; <span class='diff-add'> var lead = hzgb2312_lead;</span>&nbsp; <span class='diff-add'> hzgb2312_lead = 0x00;</span>&nbsp; <span class='diff-add'> var code_point = null;</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x21, 0x7E)) {</span>&nbsp; <span class='diff-add'> code_point = indexCodePointFor((lead - 1) * 190 +</span>&nbsp; <span class='diff-add'> (bite + 0x3F), index('gb18030'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === 0x0A) {</span>&nbsp; <span class='diff-add'> hzgb2312 = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === null) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === 0x7E) {</span>&nbsp; <span class='diff-add'> hzgb2312_lead = 0x7E;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (hzgb2312) {</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x20, 0x7F)) {</span>&nbsp; <span class='diff-add'> hzgb2312_lead = bite;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === 0x0A) {</span>&nbsp; <span class='diff-add'> hzgb2312 = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span>&nbsp; <span class='diff-add'> return bite;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function HZGB2312Encoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /** @type {boolean} */</span>&nbsp; <span class='diff-add'> var hzgb2312 = false;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span>&nbsp; <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span>&nbsp; <span class='diff-add'> var code_point = code_point_pointer.get();</span>&nbsp; <span class='diff-add'> if (code_point === EOF_code_point) {</span>&nbsp; <span class='diff-add'> return EOF_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F) && hzgb2312) {</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> hzgb2312 = false;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x7E, 0x7D);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === 0x007E) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x7E, 0x7E);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!hzgb2312) {</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> hzgb2312 = true;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x7E, 0x7B);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var pointer = indexPointerFor(code_point, index('gb18030'));</span>&nbsp; <span class='diff-add'> if (pointer === null) {</span>&nbsp; <span class='diff-add'> return encoderError(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lead = div(pointer, 190) + 1;</span>&nbsp; <span class='diff-add'> var trail = pointer % 190 - 0x3F;</span>&nbsp; <span class='diff-add'> if (!inRange(lead, 0x21, 0x7E) || !inRange(trail, 0x21, 0x7E)) {</span>&nbsp; <span class='diff-add'> return encoderError(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(lead, trail);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['hz-gb-2312'].getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new HZGB2312Encoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['hz-gb-2312'].getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new HZGB2312Decoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 11. Legacy multi-byte Chinese (traditional) encodings</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 11.1 big5</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function Big5Decoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> var /** @type {number} */ big5_lead = 0x00,</span>&nbsp; <span class='diff-add'> /** @type {?number} */ big5_pending = null;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte steram to decode.</span>&nbsp; <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span>&nbsp; <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.decode = function(byte_pointer) {</span>&nbsp; <span class='diff-add'> // NOTE: Hack to support emitting two code points</span>&nbsp; <span class='diff-add'> if (big5_pending !== null) {</span>&nbsp; <span class='diff-add'> var pending = big5_pending;</span>&nbsp; <span class='diff-add'> big5_pending = null;</span>&nbsp; <span class='diff-add'> return pending;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var bite = byte_pointer.get();</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte && big5_lead === 0x00) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte && big5_lead !== 0x00) {</span>&nbsp; <span class='diff-add'> big5_lead = 0x00;</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (big5_lead !== 0x00) {</span>&nbsp; <span class='diff-add'> var lead = big5_lead;</span>&nbsp; <span class='diff-add'> var pointer = null;</span>&nbsp; <span class='diff-add'> big5_lead = 0x00;</span>&nbsp; <span class='diff-add'> var offset = bite < 0x7F ? 0x40 : 0x62;</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE)) {</span>&nbsp; <span class='diff-add'> pointer = (lead - 0x81) * 157 + (bite - offset);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (pointer === 1133) {</span>&nbsp; <span class='diff-add'> big5_pending = 0x0304;</span>&nbsp; <span class='diff-add'> return 0x00CA;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (pointer === 1135) {</span>&nbsp; <span class='diff-add'> big5_pending = 0x030C;</span>&nbsp; <span class='diff-add'> return 0x00CA;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (pointer === 1164) {</span>&nbsp; <span class='diff-add'> big5_pending = 0x0304;</span>&nbsp; <span class='diff-add'> return 0x00EA;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (pointer === 1166) {</span>&nbsp; <span class='diff-add'> big5_pending = 0x030C;</span>&nbsp; <span class='diff-add'> return 0x00EA;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var code_point = (pointer === null) ? null :</span>&nbsp; <span class='diff-add'> indexCodePointFor(pointer, index('big5'));</span>&nbsp; <span class='diff-add'> if (pointer === null) {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === null) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span>&nbsp; <span class='diff-add'> return bite;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x81, 0xFE)) {</span>&nbsp; <span class='diff-add'> big5_lead = bite;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function Big5Encoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span>&nbsp; <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span>&nbsp; <span class='diff-add'> var code_point = code_point_pointer.get();</span>&nbsp; <span class='diff-add'> if (code_point === EOF_code_point) {</span>&nbsp; <span class='diff-add'> return EOF_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var pointer = indexPointerFor(code_point, index('big5'));</span>&nbsp; <span class='diff-add'> if (pointer === null) {</span>&nbsp; <span class='diff-add'> return encoderError(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lead = div(pointer, 157) + 0x81;</span>&nbsp; <span class='diff-add'> //if (lead < 0xA1) {</span>&nbsp; <span class='diff-add'> // return encoderError(code_point);</span>&nbsp; <span class='diff-add'> //}</span>&nbsp; <span class='diff-add'> var trail = pointer % 157;</span>&nbsp; <span class='diff-add'> var offset = trail < 0x3F ? 0x40 : 0x62;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(lead, trail + offset);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['big5'].getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new Big5Encoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['big5'].getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new Big5Decoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 12. Legacy multi-byte Japanese encodings</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 12.1 euc.jp</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function EUCJPDecoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> var /** @type {number} */ eucjp_first = 0x00,</span>&nbsp; <span class='diff-add'> /** @type {number} */ eucjp_second = 0x00;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span>&nbsp; <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span>&nbsp; <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.decode = function(byte_pointer) {</span>&nbsp; <span class='diff-add'> var bite = byte_pointer.get();</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte) {</span>&nbsp; <span class='diff-add'> if (eucjp_first === 0x00 && eucjp_second === 0x00) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> eucjp_first = 0x00;</span>&nbsp; <span class='diff-add'> eucjp_second = 0x00;</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(1);</span>&nbsp; <span class='diff-add'> var lead, code_point;</span>&nbsp; <span class='diff-add'> if (eucjp_second !== 0x00) {</span>&nbsp; <span class='diff-add'> lead = eucjp_second;</span>&nbsp; <span class='diff-add'> eucjp_second = 0x00;</span>&nbsp; <span class='diff-add'> code_point = null;</span>&nbsp; <span class='diff-add'> if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) {</span>&nbsp; <span class='diff-add'> code_point = indexCodePointFor((lead - 0xA1) * 94 + bite - 0xA1,</span>&nbsp; <span class='diff-add'> index('jis0212'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!inRange(bite, 0xA1, 0xFE)) {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === null) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (eucjp_first === 0x8E && inRange(bite, 0xA1, 0xDF)) {</span>&nbsp; <span class='diff-add'> eucjp_first = 0x00;</span>&nbsp; <span class='diff-add'> return 0xFF61 + bite - 0xA1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (eucjp_first === 0x8F && inRange(bite, 0xA1, 0xFE)) {</span>&nbsp; <span class='diff-add'> eucjp_first = 0x00;</span>&nbsp; <span class='diff-add'> eucjp_second = bite;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (eucjp_first !== 0x00) {</span>&nbsp; <span class='diff-add'> lead = eucjp_first;</span>&nbsp; <span class='diff-add'> eucjp_first = 0x00;</span>&nbsp; <span class='diff-add'> code_point = null;</span>&nbsp; <span class='diff-add'> if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) {</span>&nbsp; <span class='diff-add'> code_point = indexCodePointFor((lead - 0xA1) * 94 + bite - 0xA1,</span>&nbsp; <span class='diff-add'> index('jis0208'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!inRange(bite, 0xA1, 0xFE)) {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === null) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span>&nbsp; <span class='diff-add'> return bite;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === 0x8E || bite === 0x8F || (inRange(bite, 0xA1, 0xFE))) {</span>&nbsp; <span class='diff-add'> eucjp_first = bite;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function EUCJPEncoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span>&nbsp; <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span>&nbsp; <span class='diff-add'> var code_point = code_point_pointer.get();</span>&nbsp; <span class='diff-add'> if (code_point === EOF_code_point) {</span>&nbsp; <span class='diff-add'> return EOF_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === 0x00A5) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x5C);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === 0x203E) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x7E);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0xFF61, 0xFF9F)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x8E, code_point - 0xFF61 + 0xA1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var pointer = indexPointerFor(code_point, index('jis0208'));</span>&nbsp; <span class='diff-add'> if (pointer === null) {</span>&nbsp; <span class='diff-add'> return encoderError(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lead = div(pointer, 94) + 0xA1;</span>&nbsp; <span class='diff-add'> var trail = pointer % 94 + 0xA1;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(lead, trail);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['euc-jp'].getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new EUCJPEncoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['euc-jp'].getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new EUCJPDecoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // 12.2 iso-2022-jp</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function ISO2022JPDecoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /** @enum */</span>&nbsp; <span class='diff-add'> var state = {</span>&nbsp; <span class='diff-add'> ASCII: 0,</span>&nbsp; <span class='diff-add'> escape_start: 1,</span>&nbsp; <span class='diff-add'> escape_middle: 2,</span>&nbsp; <span class='diff-add'> escape_final: 3,</span>&nbsp; <span class='diff-add'> lead: 4,</span>&nbsp; <span class='diff-add'> trail: 5,</span>&nbsp; <span class='diff-add'> Katakana: 6</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var /** @type {number} */ iso2022jp_state = state.ASCII,</span>&nbsp; <span class='diff-add'> /** @type {boolean} */ iso2022jp_jis0212 = false,</span>&nbsp; <span class='diff-add'> /** @type {number} */ iso2022jp_lead = 0x00;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span>&nbsp; <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span>&nbsp; <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.decode = function(byte_pointer) {</span>&nbsp; <span class='diff-add'> var bite = byte_pointer.get();</span>&nbsp; <span class='diff-add'> if (bite !== EOF_byte) {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> switch (iso2022jp_state) {</span>&nbsp; <span class='diff-add'> default:</span>&nbsp; <span class='diff-add'> case state.ASCII:</span>&nbsp; <span class='diff-add'> if (bite === 0x1B) {</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.escape_start;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span>&nbsp; <span class='diff-add'> return bite;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> case state.escape_start:</span>&nbsp; <span class='diff-add'> if (bite === 0x24 || bite === 0x28) {</span>&nbsp; <span class='diff-add'> iso2022jp_lead = bite;</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.escape_middle;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite !== EOF_byte) {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.ASCII;</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> case state.escape_middle:</span>&nbsp; <span class='diff-add'> var lead = iso2022jp_lead;</span>&nbsp; <span class='diff-add'> iso2022jp_lead = 0x00;</span>&nbsp; <span class='diff-add'> if (lead === 0x24 && (bite === 0x40 || bite === 0x42)) {</span>&nbsp; <span class='diff-add'> iso2022jp_jis0212 = false;</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.lead;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (lead === 0x24 && bite === 0x28) {</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.escape_final;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (lead === 0x28 && (bite === 0x42 || bite === 0x4A)) {</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.ASCII;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (lead === 0x28 && bite === 0x49) {</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.Katakana;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte) {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-2);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.ASCII;</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> case state.escape_final:</span>&nbsp; <span class='diff-add'> if (bite === 0x44) {</span>&nbsp; <span class='diff-add'> iso2022jp_jis0212 = true;</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.lead;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte) {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-2);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-3);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.ASCII;</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> case state.lead:</span>&nbsp; <span class='diff-add'> if (bite === 0x0A) {</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.ASCII;</span>&nbsp; <span class='diff-add'> return decoderError(fatal, 0x000A);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === 0x1B) {</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.escape_start;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> iso2022jp_lead = bite;</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.trail;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> case state.trail:</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.lead;</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var code_point = null;</span>&nbsp; <span class='diff-add'> var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21;</span>&nbsp; <span class='diff-add'> if (inRange(iso2022jp_lead, 0x21, 0x7E) &&</span>&nbsp; <span class='diff-add'> inRange(bite, 0x21, 0x7E)) {</span>&nbsp; <span class='diff-add'> code_point = (iso2022jp_jis0212 === false) ?</span>&nbsp; <span class='diff-add'> indexCodePointFor(pointer, index('jis0208')) :</span>&nbsp; <span class='diff-add'> indexCodePointFor(pointer, index('jis0212'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === null) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> case state.Katakana:</span>&nbsp; <span class='diff-add'> if (bite === 0x1B) {</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.escape_start;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x21, 0x5F)) {</span>&nbsp; <span class='diff-add'> return 0xFF61 + bite - 0x21;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function ISO2022JPEncoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /** @enum */</span>&nbsp; <span class='diff-add'> var state = {</span>&nbsp; <span class='diff-add'> ASCII: 0,</span>&nbsp; <span class='diff-add'> lead: 1,</span>&nbsp; <span class='diff-add'> Katakana: 2</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var /** @type {number} */ iso2022jp_state = state.ASCII;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span>&nbsp; <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span>&nbsp; <span class='diff-add'> var code_point = code_point_pointer.get();</span>&nbsp; <span class='diff-add'> if (code_point === EOF_code_point) {</span>&nbsp; <span class='diff-add'> return EOF_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if ((inRange(code_point, 0x0000, 0x007F) ||</span>&nbsp; <span class='diff-add'> code_point === 0x00A5 || code_point === 0x203E) &&</span>&nbsp; <span class='diff-add'> iso2022jp_state !== state.ASCII) {</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.ASCII;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x1B, 0x28, 0x42);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === 0x00A5) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x5C);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === 0x203E) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x7E);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0xFF61, 0xFF9F) &&</span>&nbsp; <span class='diff-add'> iso2022jp_state !== state.Katakana) {</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.Katakana;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x1B, 0x28, 0x49);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0xFF61, 0xFF9F)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point - 0xFF61 - 0x21);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (iso2022jp_state !== state.lead) {</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> iso2022jp_state = state.lead;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x1B, 0x24, 0x42);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var pointer = indexPointerFor(code_point, index('jis0208'));</span>&nbsp; <span class='diff-add'> if (pointer === null) {</span>&nbsp; <span class='diff-add'> return encoderError(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lead = div(pointer, 94) + 0x21;</span>&nbsp; <span class='diff-add'> var trail = pointer % 94 + 0x21;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(lead, trail);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['iso-2022-jp'].getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new ISO2022JPEncoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['iso-2022-jp'].getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new ISO2022JPDecoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // 12.3 shift_jis</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function ShiftJISDecoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> var /** @type {number} */ shiftjis_lead = 0x00;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span>&nbsp; <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span>&nbsp; <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.decode = function(byte_pointer) {</span>&nbsp; <span class='diff-add'> var bite = byte_pointer.get();</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte && shiftjis_lead === 0x00) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte && shiftjis_lead !== 0x00) {</span>&nbsp; <span class='diff-add'> shiftjis_lead = 0x00;</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (shiftjis_lead !== 0x00) {</span>&nbsp; <span class='diff-add'> var lead = shiftjis_lead;</span>&nbsp; <span class='diff-add'> shiftjis_lead = 0x00;</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC)) {</span>&nbsp; <span class='diff-add'> var offset = (bite < 0x7F) ? 0x40 : 0x41;</span>&nbsp; <span class='diff-add'> var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1;</span>&nbsp; <span class='diff-add'> var code_point = indexCodePointFor((lead - lead_offset) * 188 +</span>&nbsp; <span class='diff-add'> bite - offset, index('jis0208'));</span>&nbsp; <span class='diff-add'> if (code_point === null) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x00, 0x80)) {</span>&nbsp; <span class='diff-add'> return bite;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0xA1, 0xDF)) {</span>&nbsp; <span class='diff-add'> return 0xFF61 + bite - 0xA1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) {</span>&nbsp; <span class='diff-add'> shiftjis_lead = bite;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function ShiftJISEncoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span>&nbsp; <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span>&nbsp; <span class='diff-add'> var code_point = code_point_pointer.get();</span>&nbsp; <span class='diff-add'> if (code_point === EOF_code_point) {</span>&nbsp; <span class='diff-add'> return EOF_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0000, 0x0080)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === 0x00A5) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x5C);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === 0x203E) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(0x7E);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0xFF61, 0xFF9F)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point - 0xFF61 + 0xA1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var pointer = indexPointerFor(code_point, index('jis0208'));</span>&nbsp; <span class='diff-add'> if (pointer === null) {</span>&nbsp; <span class='diff-add'> return encoderError(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lead = div(pointer, 188);</span>&nbsp; <span class='diff-add'> var lead_offset = lead < 0x1F ? 0x81 : 0xC1;</span>&nbsp; <span class='diff-add'> var trail = pointer % 188;</span>&nbsp; <span class='diff-add'> var offset = trail < 0x3F ? 0x40 : 0x41;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(lead + lead_offset, trail + offset);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['shift_jis'].getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new ShiftJISEncoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['shift_jis'].getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new ShiftJISDecoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 13. Legacy multi-byte Korean encodings</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 13.1 euc-kr</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function EUCKRDecoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> var /** @type {number} */ euckr_lead = 0x00;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span>&nbsp; <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span>&nbsp; <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.decode = function(byte_pointer) {</span>&nbsp; <span class='diff-add'> var bite = byte_pointer.get();</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte && euckr_lead === 0) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte && euckr_lead !== 0) {</span>&nbsp; <span class='diff-add'> euckr_lead = 0x00;</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (euckr_lead !== 0x00) {</span>&nbsp; <span class='diff-add'> var lead = euckr_lead;</span>&nbsp; <span class='diff-add'> var pointer = null;</span>&nbsp; <span class='diff-add'> euckr_lead = 0x00;</span>&nbsp; <span class='diff-add'> if (inRange(lead, 0x81, 0xC6)) {</span>&nbsp; <span class='diff-add'> var temp = (26 + 26 + 126) * (lead - 0x81);</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x41, 0x5A)) {</span>&nbsp; <span class='diff-add'> pointer = temp + bite - 0x41;</span>&nbsp; <span class='diff-add'> } else if (inRange(bite, 0x61, 0x7A)) {</span>&nbsp; <span class='diff-add'> pointer = temp + 26 + bite - 0x61;</span>&nbsp; <span class='diff-add'> } else if (inRange(bite, 0x81, 0xFE)) {</span>&nbsp; <span class='diff-add'> pointer = temp + 26 + 26 + bite - 0x81;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(lead, 0xC7, 0xFD) && inRange(bite, 0xA1, 0xFE)) {</span>&nbsp; <span class='diff-add'> pointer = (26 + 26 + 126) * (0xC7 - 0x81) + (lead - 0xC7) * 94 +</span>&nbsp; <span class='diff-add'> (bite - 0xA1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var code_point = (pointer === null) ? null :</span>&nbsp; <span class='diff-add'> indexCodePointFor(pointer, index('euc-kr'));</span>&nbsp; <span class='diff-add'> if (pointer === null) {</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point === null) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span>&nbsp; <span class='diff-add'> return bite;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x81, 0xFD)) {</span>&nbsp; <span class='diff-add'> euckr_lead = bite;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function EUCKREncoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span>&nbsp; <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span>&nbsp; <span class='diff-add'> var code_point = code_point_pointer.get();</span>&nbsp; <span class='diff-add'> if (code_point === EOF_code_point) {</span>&nbsp; <span class='diff-add'> return EOF_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var pointer = indexPointerFor(code_point, index('euc-kr'));</span>&nbsp; <span class='diff-add'> if (pointer === null) {</span>&nbsp; <span class='diff-add'> return encoderError(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lead, trail;</span>&nbsp; <span class='diff-add'> if (pointer < ((26 + 26 + 126) * (0xC7 - 0x81))) {</span>&nbsp; <span class='diff-add'> lead = div(pointer, (26 + 26 + 126)) + 0x81;</span>&nbsp; <span class='diff-add'> trail = pointer % (26 + 26 + 126);</span>&nbsp; <span class='diff-add'> var offset = trail < 26 ? 0x41 : trail < 26 + 26 ? 0x47 : 0x4D;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(lead, trail + offset);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> pointer = pointer - (26 + 26 + 126) * (0xC7 - 0x81);</span>&nbsp; <span class='diff-add'> lead = div(pointer, 94) + 0xC7;</span>&nbsp; <span class='diff-add'> trail = pointer % 94 + 0xA1;</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(lead, trail);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['euc-kr'].getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new EUCKREncoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['euc-kr'].getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new EUCKRDecoder(options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 14. Legacy miscellaneous encodings</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // 14.1 replacement</span>&nbsp; <span class='diff-add'> // Not needed - API throws TypeError</span>&nbsp; <span class='diff-add'> // 14.2 utf-16</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {boolean} utf16_be True if big-endian, false if little-endian.</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function UTF16Decoder(utf16_be, options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> var /** @type {?number} */ utf16_lead_byte = null,</span>&nbsp; <span class='diff-add'> /** @type {?number} */ utf16_lead_surrogate = null;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span>&nbsp; <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span>&nbsp; <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.decode = function(byte_pointer) {</span>&nbsp; <span class='diff-add'> var bite = byte_pointer.get();</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte && utf16_lead_byte === null &&</span>&nbsp; <span class='diff-add'> utf16_lead_surrogate === null) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte && (utf16_lead_byte !== null ||</span>&nbsp; <span class='diff-add'> utf16_lead_surrogate !== null)) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (utf16_lead_byte === null) {</span>&nbsp; <span class='diff-add'> utf16_lead_byte = bite;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var code_point;</span>&nbsp; <span class='diff-add'> if (utf16_be) {</span>&nbsp; <span class='diff-add'> code_point = (utf16_lead_byte << 8) + bite;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> code_point = (bite << 8) + utf16_lead_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> utf16_lead_byte = null;</span>&nbsp; <span class='diff-add'> if (utf16_lead_surrogate !== null) {</span>&nbsp; <span class='diff-add'> var lead_surrogate = utf16_lead_surrogate;</span>&nbsp; <span class='diff-add'> utf16_lead_surrogate = null;</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0xDC00, 0xDFFF)) {</span>&nbsp; <span class='diff-add'> return 0x10000 + (lead_surrogate - 0xD800) * 0x400 +</span>&nbsp; <span class='diff-add'> (code_point - 0xDC00);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(-2);</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0xD800, 0xDBFF)) {</span>&nbsp; <span class='diff-add'> utf16_lead_surrogate = code_point;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0xDC00, 0xDFFF)) {</span>&nbsp; <span class='diff-add'> return decoderError(fatal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return code_point;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {boolean} utf16_be True if big-endian, false if little-endian.</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function UTF16Encoder(utf16_be, options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span>&nbsp; <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {number} code_unit</span>&nbsp; <span class='diff-add'> * @return {number} last byte emitted</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function convert_to_bytes(code_unit) {</span>&nbsp; <span class='diff-add'> var byte1 = code_unit >> 8;</span>&nbsp; <span class='diff-add'> var byte2 = code_unit & 0x00FF;</span>&nbsp; <span class='diff-add'> if (utf16_be) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(byte1, byte2);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(byte2, byte1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var code_point = code_point_pointer.get();</span>&nbsp; <span class='diff-add'> if (code_point === EOF_code_point) {</span>&nbsp; <span class='diff-add'> return EOF_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0xD800, 0xDFFF)) {</span>&nbsp; <span class='diff-add'> encoderError(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (code_point <= 0xFFFF) {</span>&nbsp; <span class='diff-add'> return convert_to_bytes(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lead = div((code_point - 0x10000), 0x400) + 0xD800;</span>&nbsp; <span class='diff-add'> var trail = ((code_point - 0x10000) % 0x400) + 0xDC00;</span>&nbsp; <span class='diff-add'> convert_to_bytes(lead);</span>&nbsp; <span class='diff-add'> return convert_to_bytes(trail);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // 14.3 utf-16be</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['utf-16be'].getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new UTF16Encoder(true, options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['utf-16be'].getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new UTF16Decoder(true, options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // 14.4 utf-16le</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['utf-16le'].getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new UTF16Encoder(false, options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['utf-16le'].getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new UTF16Decoder(false, options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // 14.5 x-user-defined</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function XUserDefinedDecoder(options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} byte_pointer The byte stream to decode.</span>&nbsp; <span class='diff-add'> * @return {?number} The next code point decoded, or null if not enough</span>&nbsp; <span class='diff-add'> * data exists in the input stream to decode a complete code point.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.decode = function(byte_pointer) {</span>&nbsp; <span class='diff-add'> var bite = byte_pointer.get();</span>&nbsp; <span class='diff-add'> if (bite === EOF_byte) {</span>&nbsp; <span class='diff-add'> return EOF_code_point;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> byte_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(bite, 0x00, 0x7F)) {</span>&nbsp; <span class='diff-add'> return bite;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return 0xF780 + bite - 0x80;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {{fatal: boolean}} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function XUserDefinedEncoder(index, options) {</span>&nbsp; <span class='diff-add'> var fatal = options.fatal;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {ByteOutputStream} output_byte_stream Output byte stream.</span>&nbsp; <span class='diff-add'> * @param {CodePointInputStream} code_point_pointer Input stream.</span>&nbsp; <span class='diff-add'> * @return {number} The last byte emitted.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.encode = function(output_byte_stream, code_point_pointer) {</span>&nbsp; <span class='diff-add'> var code_point = code_point_pointer.get();</span>&nbsp; <span class='diff-add'> if (code_point === EOF_code_point) {</span>&nbsp; <span class='diff-add'> return EOF_byte;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> code_point_pointer.offset(1);</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0x0000, 0x007F)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (inRange(code_point, 0xF780, 0xF7FF)) {</span>&nbsp; <span class='diff-add'> return output_byte_stream.emit(code_point - 0xF780 + 0x80);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> encoderError(code_point);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['x-user-defined'].getEncoder = function(options) {</span>&nbsp; <span class='diff-add'> return new XUserDefinedEncoder(false, options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @param {{fatal: boolean}} options */</span>&nbsp; <span class='diff-add'> name_to_encoding['x-user-defined'].getDecoder = function(options) {</span>&nbsp; <span class='diff-add'> return new XUserDefinedDecoder(false, options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // NOTE: currently unused</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {string} label The encoding label.</span>&nbsp; <span class='diff-add'> * @param {ByteInputStream} input_stream The byte stream to test.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function detectEncoding(label, input_stream) {</span>&nbsp; <span class='diff-add'> if (input_stream.match([0xFF, 0xFE])) {</span>&nbsp; <span class='diff-add'> input_stream.offset(2);</span>&nbsp; <span class='diff-add'> return 'utf-16le';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (input_stream.match([0xFE, 0xFF])) {</span>&nbsp; <span class='diff-add'> input_stream.offset(2);</span>&nbsp; <span class='diff-add'> return 'utf-16be';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (input_stream.match([0xEF, 0xBB, 0xBF])) {</span>&nbsp; <span class='diff-add'> input_stream.offset(3);</span>&nbsp; <span class='diff-add'> return 'utf-8';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return label;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!('TextEncoder' in global)) global['TextEncoder'] = TextEncoder;</span>&nbsp; <span class='diff-add'> if (!('TextDecoder' in global)) global['TextDecoder'] = TextDecoder;</span>&nbsp; <span class='diff-add'>}(this));</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/events.js b/ipynb/Array-feature-overlap-05_files/events.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..48d3183</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/events.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>// Give us an object to bind all events to. This object should be created</span>&nbsp; <span class='diff-add'>// before all other objects so it exists when others register event handlers.</span>&nbsp; <span class='diff-add'>// To register an event handler:</span>&nbsp; <span class='diff-add'>//</span>&nbsp; <span class='diff-add'>// require(['base/js/events'], function (events) {</span>&nbsp; <span class='diff-add'>// events.on("event.Namespace", function () { do_stuff(); });</span>&nbsp; <span class='diff-add'>// });</span>&nbsp; <span class='diff-add'>define(['base/js/namespace', 'jquery'], function(IPython, $) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var Events = function () {};</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var events = new Events();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.Events = Events;</span>&nbsp; <span class='diff-add'> IPython.events = events;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> return $([events]);</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/gfm.js b/ipynb/Array-feature-overlap-05_files/gfm.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..80a8e2c</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/gfm.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../../lib/codemirror"), require("../markdown/markdown"), require("../../addon/mode/overlay"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../../lib/codemirror", "../markdown/markdown", "../../addon/mode/overlay"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'>"use strict";</span>&nbsp; <span class='diff-add'>CodeMirror.defineMode("gfm", function(config, modeConfig) {</span>&nbsp; <span class='diff-add'> var codeDepth = 0;</span>&nbsp; <span class='diff-add'> function blankLine(state) {</span>&nbsp; <span class='diff-add'> state.code = false;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var gfmOverlay = {</span>&nbsp; <span class='diff-add'> startState: function() {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> code: false,</span>&nbsp; <span class='diff-add'> codeBlock: false,</span>&nbsp; <span class='diff-add'> ateSpace: false</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> copyState: function(s) {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> code: s.code,</span>&nbsp; <span class='diff-add'> codeBlock: s.codeBlock,</span>&nbsp; <span class='diff-add'> ateSpace: s.ateSpace</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> token: function(stream, state) {</span>&nbsp; <span class='diff-add'> state.combineTokens = null;</span>&nbsp; <span class='diff-add'> // Hack to prevent formatting override inside code blocks (block and inline)</span>&nbsp; <span class='diff-add'> if (state.codeBlock) {</span>&nbsp; <span class='diff-add'> if (stream.match(/^```/)) {</span>&nbsp; <span class='diff-add'> state.codeBlock = false;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> stream.skipToEnd();</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (stream.sol()) {</span>&nbsp; <span class='diff-add'> state.code = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (stream.sol() && stream.match(/^```/)) {</span>&nbsp; <span class='diff-add'> stream.skipToEnd();</span>&nbsp; <span class='diff-add'> state.codeBlock = true;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // If this block is changed, it may need to be updated in Markdown mode</span>&nbsp; <span class='diff-add'> if (stream.peek() === '`') {</span>&nbsp; <span class='diff-add'> stream.next();</span>&nbsp; <span class='diff-add'> var before = stream.pos;</span>&nbsp; <span class='diff-add'> stream.eatWhile('`');</span>&nbsp; <span class='diff-add'> var difference = 1 + stream.pos - before;</span>&nbsp; <span class='diff-add'> if (!state.code) {</span>&nbsp; <span class='diff-add'> codeDepth = difference;</span>&nbsp; <span class='diff-add'> state.code = true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> if (difference === codeDepth) { // Must be exact</span>&nbsp; <span class='diff-add'> state.code = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> } else if (state.code) {</span>&nbsp; <span class='diff-add'> stream.next();</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Check if space. If so, links can be formatted later on</span>&nbsp; <span class='diff-add'> if (stream.eatSpace()) {</span>&nbsp; <span class='diff-add'> state.ateSpace = true;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (stream.sol() || state.ateSpace) {</span>&nbsp; <span class='diff-add'> state.ateSpace = false;</span>&nbsp; <span class='diff-add'> if(stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40}\b)/)) {</span>&nbsp; <span class='diff-add'> // User/Project@SHA</span>&nbsp; <span class='diff-add'> // User@SHA</span>&nbsp; <span class='diff-add'> // SHA</span>&nbsp; <span class='diff-add'> state.combineTokens = true;</span>&nbsp; <span class='diff-add'> return "link";</span>&nbsp; <span class='diff-add'> } else if (stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/)) {</span>&nbsp; <span class='diff-add'> // User/Project#Num</span>&nbsp; <span class='diff-add'> // User#Num</span>&nbsp; <span class='diff-add'> // #Num</span>&nbsp; <span class='diff-add'> state.combineTokens = true;</span>&nbsp; <span class='diff-add'> return "link";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (stream.match(/^((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i) &&</span>&nbsp; <span class='diff-add'> stream.string.slice(stream.start - 2, stream.start) != "](") {</span>&nbsp; <span class='diff-add'> // URLs</span>&nbsp; <span class='diff-add'> // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls</span>&nbsp; <span class='diff-add'> // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine</span>&nbsp; <span class='diff-add'> state.combineTokens = true;</span>&nbsp; <span class='diff-add'> return "link";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> stream.next();</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> blankLine: blankLine</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var markdownConfig = {</span>&nbsp; <span class='diff-add'> underscoresBreakWords: false,</span>&nbsp; <span class='diff-add'> taskLists: true,</span>&nbsp; <span class='diff-add'> fencedCodeBlocks: true,</span>&nbsp; <span class='diff-add'> strikethrough: true</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> for (var attr in modeConfig) {</span>&nbsp; <span class='diff-add'> markdownConfig[attr] = modeConfig[attr];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> markdownConfig.name = "markdown";</span>&nbsp; <span class='diff-add'> CodeMirror.defineMIME("gfmBase", markdownConfig);</span>&nbsp; <span class='diff-add'> return CodeMirror.overlayMode(CodeMirror.getMode(config, "gfmBase"), gfmOverlay);</span>&nbsp; <span class='diff-add'>}, "markdown");</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/half-shell___Lab_notebook_of_Steven_Roberts_1ACECD10.png b/ipynb/Array-feature-overlap-05_files/half-shell___Lab_notebook_of_Steven_Roberts_1ACECD10.png</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..a0b9b74</span>&nbsp; Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/half-shell___Lab_notebook_of_Steven_Roberts_1ACECD10.png differ <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/html-css-sanitizer-minified.js b/ipynb/Array-feature-overlap-05_files/html-css-sanitizer-minified.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..d6094fc</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/html-css-sanitizer-minified.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>var CSS_PROP_BIT_QUANTITY=1;var CSS_PROP_BIT_HASH_VALUE=2;var CSS_PROP_BIT_NEGATIVE_QUANTITY=4;var CSS_PROP_BIT_QSTRING=8;var CSS_PROP_BIT_URL=16;var CSS_PROP_BIT_UNRESERVED_WORD=64;var CSS_PROP_BIT_UNICODE_RANGE=128;var CSS_PROP_BIT_GLOBAL_NAME=512;var CSS_PROP_BIT_PROPERTY_NAME=1024;var cssSchema=function(){var L=[["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","transparent","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],["all-scroll","col-resize","crosshair","default","e-resize","hand","help","move","n-resize","ne-resize","no-drop","not-allowed","nw-resize","pointer","progress","row-resize","s-resize","se-resize","sw-resize","text","vertical-text","w-resize","wait"],["armenian","decimal","decimal-leading-zero","disc","georgian","lower-alpha","lower-greek","lower-latin","lower-roman","square","upper-alpha","upper-latin","upper-roman"],["100","200","300","400","500","600","700","800","900","bold","bolder","lighter"],["block-level","inline-level","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group"],["condensed","expanded","extra-condensed","extra-expanded","narrower","semi-condensed","semi-expanded","ultra-condensed","ultra-expanded","wider"],["inherit","inline","inline-block","inline-box","inline-flex","inline-grid","inline-list-item","inline-stack","inline-table","run-in"],["behind","center-left","center-right","far-left","far-right","left-side","leftwards","right-side","rightwards"],["large","larger","small","smaller","x-large","x-small","xx-large","xx-small"],["dashed","dotted","double","groove","outset","ridge","solid"],["ease","ease-in","ease-in-out","ease-out","linear","step-end","step-start"],["at","closest-corner","closest-side","ellipse","farthest-corner","farthest-side"],["baseline","middle","sub","super","text-bottom","text-top"],["caption","icon","menu","message-box","small-caption","status-bar"],["fast","faster","slow","slower","x-fast","x-slow"],["above","below","higher","level","lower"],["cursive","fantasy","monospace","sans-serif","serif"],["loud","silent","soft","x-loud","x-soft"],["no-repeat","repeat-x","repeat-y","round","space"],["blink","line-through","overline","underline"],["block","flex","grid","table"],["high","low","x-high","x-low"],["nowrap","pre","pre-line","pre-wrap"],["absolute","relative","static"],["alternate","alternate-reverse","reverse"],["border-box","content-box","padding-box"],["capitalize","lowercase","uppercase"],["child","female","male"],["=","opacity"],["backwards","forwards"],["bidi-override","embed"],["bottom","top"],["break-all","keep-all"],["clip","ellipsis"],["contain","cover"],["continuous","digits"],["end","start"],["flat","preserve-3d"],["hide","show"],["horizontal","vertical"],["inside","outside"],["italic","oblique"],["left","right"],["ltr","rtl"],["no-content","no-display"],["paused","running"],["suppress","unrestricted"],["thick","thin"],[","],["/"],["all"],["always"],["auto"],["avoid"],["both"],["break-word"],["center"],["circle"],["code"],["collapse"],["contents"],["fixed"],["hidden"],["infinite"],["inset"],["invert"],["justify"],["list-item"],["local"],["medium"],["mix"],["none"],["normal"],["once"],["repeat"],["scroll"],["separate"],["small-caps"],["spell-out"],["to"],["visible"]];var schema={animation:{cssPropBits:517,cssLitGroup:[L[10],L[24],L[29],L[45],L[48],L[54],L[63],L[71],L[72]],cssFns:["cubic-bezier()","steps()"]},"animation-delay":{cssPropBits:5,cssLitGroup:[L[48]],cssFns:[]},"animation-direction":{cssPropBits:0,cssLitGroup:[L[24],L[48],L[72]],cssFns:[]},"animation-duration":"animation-delay","animation-fill-mode":{cssPropBits:0,cssLitGroup:[L[29],L[48],L[54],L[71]],cssFns:[]},"animation-iteration-count":{cssPropBits:5,cssLitGroup:[L[48],L[63]],cssFns:[]},"animation-name":{cssPropBits:512,cssLitGroup:[L[48],L[71]],cssFns:[]},"animation-play-state":{cssPropBits:0,cssLitGroup:[L[45],L[48]],cssFns:[]},"animation-timing-function":{cssPropBits:0,cssLitGroup:[L[10],L[48]],cssFns:["cubic-bezier()","steps()"]},appearance:{cssPropBits:0,cssLitGroup:[L[71]],cssFns:[]},azimuth:{cssPropBits:5,cssLitGroup:[L[7],L[42],L[56]],cssFns:[]},"backface-visibility":{cssPropBits:0,cssLitGroup:[L[59],L[62],L[80]],cssFns:[]},background:{cssPropBits:23,cssLitGroup:[L[0],L[18],L[25],L[31],L[34],L[42],L[48],L[49],L[52],L[56],L[61],L[68],L[71],L[74],L[75]],cssFns:["image()","linear-gradient()","radial-gradient()","repeating-linear-gradient()","repeating-radial-gradient()","rgb()","rgba()"]},"background-attachment":{cssPropBits:0,cssLitGroup:[L[48],L[61],L[68],L[75]],cssFns:[]},"background-color":{cssPropBits:2,cssLitGroup:[L[0]],cssFns:["rgb()","rgba()"]},"background-image":{cssPropBits:16,cssLitGroup:[L[48],L[71]],cssFns:["image()","linear-gradient()","radial-gradient()","repeating-linear-gradient()","repeating-radial-gradient()"]},"background-position":{cssPropBits:5,cssLitGroup:[L[31],L[42],L[48],L[56]],cssFns:[]},"background-repeat":{cssPropBits:0,cssLitGroup:[L[18],L[48],L[74]],cssFns:[]},"background-size":{cssPropBits:5,cssLitGroup:[L[34],L[48],L[52]],cssFns:[]},border:{cssPropBits:7,cssLitGroup:[L[0],L[9],L[47],L[62],L[64],L[69],L[71]],cssFns:["rgb()","rgba()"]},"border-bottom":"border","border-bottom-color":"background-color","border-bottom-left-radius":{cssPropBits:5,cssFns:[]},"border-bottom-right-radius":"border-bottom-left-radius","border-bottom-style":{cssPropBits:0,cssLitGroup:[L[9],L[62],L[64],L[71]],cssFns:[]},"border-bottom-width":{cssPropBits:5,cssLitGroup:[L[47],L[69]],cssFns:[]},"border-collapse":{cssPropBits:0,cssLitGroup:[L[59],L[76]],cssFns:[]},"border-color":"background-color","border-left":"border","border-left-color":"background-color","border-left-style":"border-bottom-style","border-left-width":"border-bottom-width","border-radius":{cssPropBits:5,cssLitGroup:[L[49]],cssFns:[]},"border-right":"border","border-right-color":"background-color","border-right-style":"border-bottom-style","border-right-width":"border-bottom-width","border-spacing":"border-bottom-left-radius","border-style":"border-bottom-style","border-top":"border","border-top-color":"background-color","border-top-left-radius":"border-bottom-left-radius","border-top-right-radius":"border-bottom-left-radius","border-top-style":"border-bottom-style","border-top-width":"border-bottom-width","border-width":"border-bottom-width",bottom:{cssPropBits:5,cssLitGroup:[L[52]],cssFns:[]},box:{cssPropBits:0,cssLitGroup:[L[60],L[71],L[72]],cssFns:[]},"box-shadow":{cssPropBits:7,cssLitGroup:[L[0],L[48],L[64],L[71]],cssFns:["rgb()","rgba()"]},"box-sizing":{cssPropBits:0,cssLitGroup:[L[25]],cssFns:[]},"caption-side":{cssPropBits:0,cssLitGroup:[L[31]],cssFns:[]},clear:{cssPropBits:0,cssLitGroup:[L[42],L[54],L[71]],cssFns:[]},clip:{cssPropBits:0,cssLitGroup:[L[52]],cssFns:["rect()"]},color:"background-color",content:{cssPropBits:8,cssLitGroup:[L[71],L[72]],cssFns:[]},cue:{cssPropBits:16,cssLitGroup:[L[71]],cssFns:[]},"cue-after":"cue","cue-before":"cue",cursor:{cssPropBits:16,cssLitGroup:[L[1],L[48],L[52]],cssFns:[]},direction:{cssPropBits:0,cssLitGroup:[L[43]],cssFns:[]},display:{cssPropBits:0,cssLitGroup:[L[4],L[6],L[20],L[52],L[67],L[71]],cssFns:[]},"display-extras":{cssPropBits:0,cssLitGroup:[L[67],L[71]],cssFns:[]},"display-inside":{cssPropBits:0,cssLitGroup:[L[20],L[52]],cssFns:[]},"display-outside":{cssPropBits:0,cssLitGroup:[L[4],L[71]],cssFns:[]},elevation:{cssPropBits:5,cssLitGroup:[L[15]],cssFns:[]},"empty-cells":{cssPropBits:0,cssLitGroup:[L[38]],cssFns:[]},filter:{cssPropBits:0,cssFns:["alpha()"]},"float":{cssPropBits:0,cssLitGroup:[L[42],L[71]],cssFns:[]},font:{cssPropBits:73,cssLitGroup:[L[3],L[8],L[13],L[16],L[41],L[48],L[49],L[69],L[72],L[77]],cssFns:[]},"font-family":{cssPropBits:72,cssLitGroup:[L[16],L[48]],cssFns:[]},"font-size":{cssPropBits:1,cssLitGroup:[L[8],L[69]],cssFns:[]},"font-stretch":{cssPropBits:0,cssLitGroup:[L[5],L[72]],cssFns:[]},"font-style":{cssPropBits:0,cssLitGroup:[L[41],L[72]],cssFns:[]},"font-variant":{cssPropBits:0,cssLitGroup:[L[72],L[77]],cssFns:[]},"font-weight":{cssPropBits:0,cssLitGroup:[L[3],L[72]],cssFns:[]},height:"bottom",left:"bottom","letter-spacing":{cssPropBits:5,cssLitGroup:[L[72]],cssFns:[]},"line-height":{cssPropBits:1,cssLitGroup:[L[72]],cssFns:[]},"list-style":{cssPropBits:16,cssLitGroup:[L[2],L[40],L[57],L[71]],cssFns:["image()","linear-gradient()","radial-gradient()","repeating-linear-gradient()","repeating-radial-gradient()"]},"list-style-image":{cssPropBits:16,cssLitGroup:[L[71]],cssFns:["image()","linear-gradient()","radial-gradient()","repeating-linear-gradient()","repeating-radial-gradient()"]},"list-style-position":{cssPropBits:0,cssLitGroup:[L[40]],cssFns:[]},"list-style-type":{cssPropBits:0,cssLitGroup:[L[2],L[57],L[71]],cssFns:[]},margin:"bottom","margin-bottom":"bottom","margin-left":"bottom","margin-right":"bottom","margin-top":"bottom","max-height":{cssPropBits:1,cssLitGroup:[L[52],L[71]],cssFns:[]},"max-width":"max-height","min-height":{cssPropBits:1,cssLitGroup:[L[52]],cssFns:[]},"min-width":"min-height",opacity:{cssPropBits:1,cssFns:[]},outline:{cssPropBits:7,cssLitGroup:[L[0],L[9],L[47],L[62],L[64],L[65],L[69],L[71]],cssFns:["rgb()","rgba()"]},"outline-color":{cssPropBits:2,cssLitGroup:[L[0],L[65]],cssFns:["rgb()","rgba()"]},"outline-style":"border-bottom-style","outline-width":"border-bottom-width",overflow:{cssPropBits:0,cssLitGroup:[L[52],L[62],L[75],L[80]],cssFns:[]},"overflow-wrap":{cssPropBits:0,cssLitGroup:[L[55],L[72]],cssFns:[]},"overflow-x":{cssPropBits:0,cssLitGroup:[L[44],L[52],L[62],L[75],L[80]],cssFns:[]},"overflow-y":"overflow-x",padding:"opacity","padding-bottom":"opacity","padding-left":"opacity","padding-right":"opacity","padding-top":"opacity","page-break-after":{cssPropBits:0,cssLitGroup:[L[42],L[51],L[52],L[53]],cssFns:[]},"page-break-before":"page-break-after","page-break-inside":{cssPropBits:0,cssLitGroup:[L[52],L[53]],cssFns:[]},pause:"border-bottom-left-radius","pause-after":"border-bottom-left-radius","pause-before":"border-bottom-left-radius",perspective:{cssPropBits:5,cssLitGroup:[L[71]],cssFns:[]},"perspective-origin":{cssPropBits:5,cssLitGroup:[L[31],L[42],L[56]],cssFns:[]},pitch:{cssPropBits:5,cssLitGroup:[L[21],L[69]],cssFns:[]},"pitch-range":"border-bottom-left-radius","play-during":{cssPropBits:16,cssLitGroup:[L[52],L[70],L[71],L[74]],cssFns:[]},position:{cssPropBits:0,cssLitGroup:[L[23]],cssFns:[]},quotes:{cssPropBits:8,cssLitGroup:[L[71]],cssFns:[]},resize:{cssPropBits:0,cssLitGroup:[L[39],L[54],L[71]],cssFns:[]},richness:"border-bottom-left-radius",right:"bottom",speak:{cssPropBits:0,cssLitGroup:[L[71],L[72],L[78]],cssFns:[]},"speak-header":{cssPropBits:0,cssLitGroup:[L[51],L[73]],cssFns:[]},"speak-numeral":{cssPropBits:0,cssLitGroup:[L[35]],cssFns:[]},"speak-punctuation":{cssPropBits:0,cssLitGroup:[L[58],L[71]],cssFns:[]},"speech-rate":{cssPropBits:5,cssLitGroup:[L[14],L[69]],cssFns:[]},stress:"border-bottom-left-radius","table-layout":{cssPropBits:0,cssLitGroup:[L[52],L[61]],cssFns:[]},"text-align":{cssPropBits:0,cssLitGroup:[L[42],L[56],L[66]],cssFns:[]},"text-decoration":{cssPropBits:0,cssLitGroup:[L[19],L[71]],cssFns:[]},"text-indent":"border-bottom-left-radius","text-overflow":{cssPropBits:8,cssLitGroup:[L[33]],cssFns:[]},"text-shadow":"box-shadow","text-transform":{cssPropBits:0,cssLitGroup:[L[26],L[71]],cssFns:[]},"text-wrap":{cssPropBits:0,cssLitGroup:[L[46],L[71],L[72]],cssFns:[]},top:"bottom",transform:{cssPropBits:0,cssLitGroup:[L[71]],cssFns:["matrix()","perspective()","rotate()","rotate3d()","rotatex()","rotatey()","rotatez()","scale()","scale3d()","scalex()","scaley()","scalez()","skew()","skewx()","skewy()","translate()","translate3d()","translatex()","translatey()","translatez()"]},"transform-origin":"perspective-origin","transform-style":{cssPropBits:0,cssLitGroup:[L[37]],cssFns:[]},transition:{cssPropBits:1029,cssLitGroup:[L[10],L[48],L[50],L[71]],cssFns:["cubic-bezier()","steps()"]},"transition-delay":"animation-delay","transition-duration":"animation-delay","transition-property":{cssPropBits:1024,cssLitGroup:[L[48],L[50]],cssFns:[]},"transition-timing-function":"animation-timing-function","unicode-bidi":{cssPropBits:0,cssLitGroup:[L[30],L[72]],cssFns:[]},"vertical-align":{cssPropBits:5,cssLitGroup:[L[12],L[31]],cssFns:[]},visibility:"backface-visibility","voice-family":{cssPropBits:8,cssLitGroup:[L[27],L[48]],cssFns:[]},volume:{cssPropBits:1,cssLitGroup:[L[17],L[69]],cssFns:[]},"white-space":{cssPropBits:0,cssLitGroup:[L[22],L[72]],cssFns:[]},width:"min-height","word-break":{cssPropBits:0,cssLitGroup:[L[32],L[72]],cssFns:[]},"word-spacing":"letter-spacing","word-wrap":"overflow-wrap","z-index":"bottom",zoom:"line-height","cubic-bezier()":"animation-delay","steps()":{cssPropBits:5,cssLitGroup:[L[36],L[48]],cssFns:[]},"image()":{cssPropBits:18,cssLitGroup:[L[0],L[48]],cssFns:["rgb()","rgba()"]},"linear-gradient()":{cssPropBits:7,cssLitGroup:[L[0],L[31],L[42],L[48],L[79]],cssFns:["rgb()","rgba()"]},"radial-gradient()":{cssPropBits:7,cssLitGroup:[L[0],L[11],L[31],L[42],L[48],L[56],L[57]],cssFns:["rgb()","rgba()"]},"repeating-linear-gradient()":"linear-gradient()","repeating-radial-gradient()":"radial-gradient()","rgb()":{cssPropBits:1,cssLitGroup:[L[48]],cssFns:[]},"rgba()":"rgb()","rect()":{cssPropBits:5,cssLitGroup:[L[48],L[52]],cssFns:[]},"alpha()":{cssPropBits:1,cssLitGroup:[L[28]],cssFns:[]},"matrix()":"animation-delay","perspective()":"border-bottom-left-radius","rotate()":"border-bottom-left-radius","rotate3d()":"animation-delay","rotatex()":"border-bottom-left-radius","rotatey()":"border-bottom-left-radius","rotatez()":"border-bottom-left-radius","scale()":"animation-delay","scale3d()":"animation-delay","scalex()":"border-bottom-left-radius","scaley()":"border-bottom-left-radius","scalez()":"border-bottom-left-radius","skew()":"animation-delay","skewx()":"border-bottom-left-radius","skewy()":"border-bottom-left-radius","translate()":"animation-delay","translate3d()":"animation-delay","translatex()":"border-bottom-left-radius","translatey()":"border-bottom-left-radius","translatez()":"border-bottom-left-radius"};if(true){for(var key in schema){if("string"===typeof schema[key]&&Object.hasOwnProperty.call(schema,key)){schema[key]=schema[schema[key]]}}}return schema}();if(typeof window!=="undefined"){window["cssSchema"]=cssSchema}var lexCss;var decodeCss;(function(){function decodeCssEscape(s){var i=parseInt(s.substring(1),16);if(i>65535){return i-=65536,String.fromCharCode(55296+(i>>10),56320+(i&1023))}else if(i==i){return String.fromCharCode(i)}else if(s[1]<" "){return""}else{return s[1]}}function escapeCssString(s,replacer){return'"'+s.replace(/[\u0000-\u001f\\\"<>]/g,replacer)+'"'}function escapeCssStrChar(ch){return cssStrChars[ch]||(cssStrChars[ch]="\\"+ch.charCodeAt(0).toString(16)+" ")}function escapeCssUrlChar(ch){return cssUrlChars[ch]||(cssUrlChars[ch]=(ch<""?"%0":"%")+ch.charCodeAt(0).toString(16))}var cssStrChars={"\\":"\\\\"};var cssUrlChars={"\\":"%5c"};var WC="[\\t\\n\\f ]";var W=WC+"*";var NL="[\\n\\f]";var SURROGATE_PAIR="[\\ud800-\\udbff][\\udc00-\\udfff]";var NONASCII="[\\u0080-\\ud7ff\\ue000-\\ufffd]|"+SURROGATE_PAIR;var UNICODE_TAIL="[0-9a-fA-F]{1,6}"+WC+"?";var UNICODE="\\\\"+UNICODE_TAIL;var ESCAPE_TAIL="(?:"+UNICODE_TAIL+"|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|"+SURROGATE_PAIR+")";var ESCAPE="\\\\"+ESCAPE_TAIL;var URLCHAR="(?:[\\t\\x21\\x23-\\x26\\x28-\\x5b\\x5d-\\x7e]|"+NONASCII+"|"+ESCAPE+")";var STRINGCHAR="[^'\"\\n\\f\\\\]|\\\\[\\s\\S]";var STRING="\"(?:'|"+STRINGCHAR+')*"'+"|'(?:\"|"+STRINGCHAR+")*'";var NUM="[-+]?(?:[0-9]+(?:[.][0-9]+)?|[.][0-9]+)";var NMSTART="(?:[a-zA-Z_]|"+NONASCII+"|"+ESCAPE+")";var NMCHAR="(?:[a-zA-Z0-9_-]|"+NONASCII+"|"+ESCAPE+")";var NAME=NMCHAR+"+";var IDENT="-?"+NMSTART+NMCHAR+"*";var ATKEYWORD="@"+IDENT;var HASH="#"+NAME;var NUMBER=NUM;var WORD_TERM="(?:@?-?"+NMSTART+"|#)"+NMCHAR+"*";var PERCENTAGE=NUM+"%";var DIMENSION=NUM+IDENT;var NUMERIC_VALUE=NUM+"(?:%|"+IDENT+")?";var URI="url[(]"+W+"(?:"+STRING+"|"+URLCHAR+"*)"+W+"[)]";var UNICODE_RANGE="U[+][0-9A-F?]{1,6}(?:-[0-9A-F]{1,6})?";var CDO="<!--";var CDC="-->";var S=WC+"+";var COMMENT="/(?:[*][^*]*[*]+(?:[^/][^*]*[*]+)*/|/[^\\n\\f]*)";var FUNCTION="(?!url[(])"+IDENT+"[(]";var INCLUDES="~=";var DASHMATCH="[|]=";var PREFIXMATCH="[^]=";var SUFFIXMATCH="[$]=";var SUBSTRINGMATCH="[*]=";var CMP_OPS="[~|^$*]=";var CHAR="[^\"'\\\\/]|/(?![/*])";var BOM="\\uFEFF";var CSS_TOKEN=new RegExp([BOM,UNICODE_RANGE,URI,FUNCTION,WORD_TERM,STRING,NUMERIC_VALUE,CDO,CDC,S,COMMENT,CMP_OPS,CHAR].join("|"),"gi");var CSS_DECODER=new RegExp("\\\\(?:"+ESCAPE_TAIL+"|"+NL+")","g");var URL_RE=new RegExp("^url\\("+W+"[\"']?|[\"']?"+W+"\\)$","gi");decodeCss=function(css){return css.replace(CSS_DECODER,decodeCssEscape)};lexCss=function(cssText){cssText=""+cssText;var tokens=cssText.replace(/\r\n?/g,"\n").match(CSS_TOKEN)||[];var j=0;var last=" ";for(var i=0,n=tokens.length;i<n;++i){var tok=decodeCss(tokens[i]);var len=tok.length;var cc=tok.charCodeAt(0);tok=cc=='"'.charCodeAt(0)||cc=="'".charCodeAt(0)?escapeCssString(tok.substring(1,len-1),escapeCssStrChar):cc=="/".charCodeAt(0)&&len>1||tok=="\\"||tok==CDC||tok==CDO||tok==""||cc<=" ".charCodeAt(0)?" ":/url\(/i.test(tok)?"url("+escapeCssString(tok.replace(URL_RE,""),escapeCssUrlChar)+")":tok;if(last!=tok||tok!=" "){tokens[j++]=last=tok}}tokens.length=j;return tokens}})();if(typeof window!=="undefined"){window["lexCss"]=lexCss;window["decodeCss"]=decodeCss}var URI=function(){function parse(uriStr){var m=(""+uriStr).match(URI_RE_);if(!m){return null}return new URI(nullIfAbsent(m[1]),nullIfAbsent(m[2]),nullIfAbsent(m[3]),nullIfAbsent(m[4]),nullIfAbsent(m[5]),nullIfAbsent(m[6]),nullIfAbsent(m[7]))}function create(scheme,credentials,domain,port,path,query,fragment){var uri=new URI(encodeIfExists2(scheme,URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_),encodeIfExists2(credentials,URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_),encodeIfExists(domain),port>0?port.toString():null,encodeIfExists2(path,URI_DISALLOWED_IN_PATH_),null,encodeIfExists(fragment));if(query){if("string"===typeof query){uri.setRawQuery(query.replace(/[^?&=0-9A-Za-z_\-~.%]/g,encodeOne))}else{uri.setAllParameters(query)}}return uri}function encodeIfExists(unescapedPart){if("string"==typeof unescapedPart){return encodeURIComponent(unescapedPart)}return null}function encodeIfExists2(unescapedPart,extra){if("string"==typeof unescapedPart){return encodeURI(unescapedPart).replace(extra,encodeOne)}return null}function encodeOne(ch){var n=ch.charCodeAt(0);return"%"+"0123456789ABCDEF".charAt(n>>4&15)+"0123456789ABCDEF".charAt(n&15)}function normPath(path){return path.replace(/(^|\/)\.(?:\/|$)/g,"$1").replace(/\/{2,}/g,"/")}var PARENT_DIRECTORY_HANDLER=new RegExp(""+"(/|^)"+"(?:[^./][^/]*|\\.{2,}(?:[^./][^/]*)|\\.{3,}[^/]*)"+"/\\.\\.(?:/|$)");var PARENT_DIRECTORY_HANDLER_RE=new RegExp(PARENT_DIRECTORY_HANDLER);var EXTRA_PARENT_PATHS_RE=/^(?:\.\.\/)*(?:\.\.$)?/;function collapse_dots(path){if(path===null){return null}var p=normPath(path);var r=PARENT_DIRECTORY_HANDLER_RE;for(var q;(q=p.replace(r,"$1"))!=p;p=q){}return p}function resolve(baseUri,relativeUri){var absoluteUri=baseUri.clone();var overridden=relativeUri.hasScheme();if(overridden){absoluteUri.setRawScheme(relativeUri.getRawScheme())}else{overridden=relativeUri.hasCredentials()}if(overridden){absoluteUri.setRawCredentials(relativeUri.getRawCredentials())}else{overridden=relativeUri.hasDomain()}if(overridden){absoluteUri.setRawDomain(relativeUri.getRawDomain())}else{overridden=relativeUri.hasPort()}var rawPath=relativeUri.getRawPath();var simplifiedPath=collapse_dots(rawPath);if(overridden){absoluteUri.setPort(relativeUri.getPort());simplifiedPath=simplifiedPath&&simplifiedPath.replace(EXTRA_PARENT_PATHS_RE,"")}else{overridden=!!rawPath;if(overridden){if(simplifiedPath.charCodeAt(0)!==47){var absRawPath=collapse_dots(absoluteUri.getRawPath()||"").replace(EXTRA_PARENT_PATHS_RE,"");var slash=absRawPath.lastIndexOf("/")+1;simplifiedPath=collapse_dots((slash?absRawPath.substring(0,slash):"")+collapse_dots(rawPath)).replace(EXTRA_PARENT_PATHS_RE,"")}}else{simplifiedPath=simplifiedPath&&simplifiedPath.replace(EXTRA_PARENT_PATHS_RE,"");if(simplifiedPath!==rawPath){absoluteUri.setRawPath(simplifiedPath)}}}if(overridden){absoluteUri.setRawPath(simplifiedPath)}else{overridden=relativeUri.hasQuery()}if(overridden){absoluteUri.setRawQuery(relativeUri.getRawQuery())}else{overridden=relativeUri.hasFragment()}if(overridden){absoluteUri.setRawFragment(relativeUri.getRawFragment())}return absoluteUri}function URI(rawScheme,rawCredentials,rawDomain,port,rawPath,rawQuery,rawFragment){this.scheme_=rawScheme;this.credentials_=rawCredentials;this.domain_=rawDomain;this.port_=port;this.path_=rawPath;this.query_=rawQuery;this.fragment_=rawFragment;this.paramCache_=null}URI.prototype.toString=function(){var out=[];if(null!==this.scheme_){out.push(this.scheme_,":")}if(null!==this.domain_){out.push("//");if(null!==this.credentials_){out.push(this.credentials_,"@")}out.push(this.domain_);if(null!==this.port_){out.push(":",this.port_.toString())}}if(null!==this.path_){out.push(this.path_)}if(null!==this.query_){out.push("?",this.query_)}if(null!==this.fragment_){out.push("#",this.fragment_)}return out.join("")};URI.prototype.clone=function(){return new URI(this.scheme_,this.credentials_,this.domain_,this.port_,this.path_,this.query_,this.fragment_)};URI.prototype.getScheme=function(){return this.scheme_&&decodeURIComponent(this.scheme_).toLowerCase()};URI.prototype.getRawScheme=function(){return this.scheme_};URI.prototype.setScheme=function(newScheme){this.scheme_=encodeIfExists2(newScheme,URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_);return this};URI.prototype.setRawScheme=function(newScheme){this.scheme_=newScheme?newScheme:null;return this};URI.prototype.hasScheme=function(){return null!==this.scheme_};URI.prototype.getCredentials=function(){return this.credentials_&&decodeURIComponent(this.credentials_)};URI.prototype.getRawCredentials=function(){return this.credentials_};URI.prototype.setCredentials=function(newCredentials){this.credentials_=encodeIfExists2(newCredentials,URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_);return this};URI.prototype.setRawCredentials=function(newCredentials){this.credentials_=newCredentials?newCredentials:null;return this};URI.prototype.hasCredentials=function(){return null!==this.credentials_};URI.prototype.getDomain=function(){return this.domain_&&decodeURIComponent(this.domain_)};URI.prototype.getRawDomain=function(){return this.domain_};URI.prototype.setDomain=function(newDomain){return this.setRawDomain(newDomain&&encodeURIComponent(newDomain))};URI.prototype.setRawDomain=function(newDomain){this.domain_=newDomain?newDomain:null;return this.setRawPath(this.path_)};URI.prototype.hasDomain=function(){return null!==this.domain_};URI.prototype.getPort=function(){return this.port_&&decodeURIComponent(this.port_)};URI.prototype.setPort=function(newPort){if(newPort){newPort=Number(newPort);if(newPort!==(newPort&65535)){throw new Error("Bad port number "+newPort)}this.port_=""+newPort}else{this.port_=null}return this};URI.prototype.hasPort=function(){return null!==this.port_};URI.prototype.getPath=function(){return this.path_&&decodeURIComponent(this.path_)};URI.prototype.getRawPath=function(){return this.path_};URI.prototype.setPath=function(newPath){return this.setRawPath(encodeIfExists2(newPath,URI_DISALLOWED_IN_PATH_))};URI.prototype.setRawPath=function(newPath){if(newPath){newPath=String(newPath);this.path_=!this.domain_||/^\//.test(newPath)?newPath:"/"+newPath}else{this.path_=null}return this};URI.prototype.hasPath=function(){return null!==this.path_};URI.prototype.getQuery=function(){return this.query_&&decodeURIComponent(this.query_).replace(/\+/g," ")};URI.prototype.getRawQuery=function(){return this.query_};URI.prototype.setQuery=function(newQuery){this.paramCache_=null;this.query_=encodeIfExists(newQuery);return this};URI.prototype.setRawQuery=function(newQuery){this.paramCache_=null;this.query_=newQuery?newQuery:null;return this};URI.prototype.hasQuery=function(){return null!==this.query_};URI.prototype.setAllParameters=function(params){if(typeof params==="object"){if(!(params instanceof Array)&&(params instanceof Object||Object.prototype.toString.call(params)!=="[object Array]")){var newParams=[];var i=-1;for(var k in params){var v=params[k];if("string"===typeof v){newParams[++i]=k;newParams[++i]=v}}params=newParams}}this.paramCache_=null;var queryBuf=[];var separator="";for(var j=0;j<params.length;){var k=params[j++];var v=params[j++];queryBuf.push(separator,encodeURIComponent(k.toString()));separator="&";if(v){queryBuf.push("=",encodeURIComponent(v.toString()))}}this.query_=queryBuf.join("");return this};URI.prototype.checkParameterCache_=function(){if(!this.paramCache_){var q=this.query_;if(!q){this.paramCache_=[]}else{var cgiParams=q.split(/[&\?]/);var out=[];var k=-1;for(var i=0;i<cgiParams.length;++i){var m=cgiParams[i].match(/^([^=]*)(?:=(.*))?$/);out[++k]=decodeURIComponent(m[1]).replace(/\+/g," ");out[++k]=decodeURIComponent(m[2]||"").replace(/\+/g," ")}this.paramCache_=out}}};URI.prototype.setParameterValues=function(key,values){if(typeof values==="string"){values=[values]}this.checkParameterCache_();var newValueIndex=0;var pc=this.paramCache_;var params=[];for(var i=0,k=0;i<pc.length;i+=2){if(key===pc[i]){if(newValueIndex<values.length){params.push(key,values[newValueIndex++])}}else{params.push(pc[i],pc[i+1])}}while(newValueIndex<values.length){params.push(key,values[newValueIndex++])}this.setAllParameters(params);return this};URI.prototype.removeParameter=function(key){return this.setParameterValues(key,[])};URI.prototype.getAllParameters=function(){this.checkParameterCache_();return this.paramCache_.slice(0,this.paramCache_.length)};URI.prototype.getParameterValues=function(paramNameUnescaped){this.checkParameterCache_();var values=[];for(var i=0;i<this.paramCache_.length;i+=2){if(paramNameUnescaped===this.paramCache_[i]){values.push(this.paramCache_[i+1])}}return values};URI.prototype.getParameterMap=function(paramNameUnescaped){this.checkParameterCache_();var paramMap={};for(var i=0;i<this.paramCache_.length;i+=2){var key=this.paramCache_[i++],value=this.paramCache_[i++];if(!(key in paramMap)){paramMap[key]=[value]}else{paramMap[key].push(value)}}return paramMap};URI.prototype.getParameterValue=function(paramNameUnescaped){this.checkParameterCache_();for(var i=0;i<this.paramCache_.length;i+=2){if(paramNameUnescaped===this.paramCache_[i]){return this.paramCache_[i+1]}}return null};URI.prototype.getFragment=function(){return this.fragment_&&decodeURIComponent(this.fragment_)};URI.prototype.getRawFragment=function(){return this.fragment_};URI.prototype.setFragment=function(newFragment){this.fragment_=newFragment?encodeURIComponent(newFragment):null;return this};URI.prototype.setRawFragment=function(newFragment){this.fragment_=newFragment?newFragment:null;return this};URI.prototype.hasFragment=function(){return null!==this.fragment_};function nullIfAbsent(matchPart){return"string"==typeof matchPart&&matchPart.length>0?matchPart:null}var URI_RE_=new RegExp("^"+"(?:"+"([^:/?#]+)"+":)?"+"(?://"+"(?:([^/?#]*)@)?"+"([^/?#:@]*)"+"(?::([0-9]+))?"+")?"+"([^?#]+)?"+"(?:\\?([^#]*))?"+"(?:#(.*))?"+"$");var URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_=/[#\/\?@]/g;var URI_DISALLOWED_IN_PATH_=/[\#\?]/g;URI.parse=parse;URI.create=create;URI.resolve=resolve;URI.collapse_dots=collapse_dots;URI.utils={mimeTypeOf:function(uri){var uriObj=parse(uri);if(/\.html$/.test(uriObj.getPath())){return"text/html"}else{return"application/javascript"}},resolve:function(base,uri){if(base){return resolve(parse(base),parse(uri)).toString()}else{return""+uri}}};return URI}();if(typeof window!=="undefined"){window["URI"]=URI}var sanitizeCssProperty=undefined;var sanitizeCssSelectorList=undefined;var sanitizeStylesheet=undefined;var sanitizeStylesheetWithExternals=undefined;var sanitizeMediaQuery=undefined;(function(){var NOEFFECT_URL='url("about:blank")';var NORM_URL_REGEXP=/[\n\f\r\"\'()*<>]/g;var NORM_URL_REPLACEMENTS={"\n":"%0a","\f":"%0c","\r":"%0d",'"':"%22","'":"%27","(":"%28",")":"%29","*":"%2a","<":"%3c",">":"%3e"};function normalizeUrl(s){if("string"===typeof s){return'url("'+s.replace(NORM_URL_REGEXP,normalizeUrlChar)+'")'}else{return NOEFFECT_URL}}function normalizeUrlChar(ch){return NORM_URL_REPLACEMENTS[ch]}var URI_SCHEME_RE=new RegExp("^"+"(?:"+"([^:/?# ]+)"+":)?");var ALLOWED_URI_SCHEMES=/^(?:https?|mailto)$/i;function resolveUri(baseUri,uri){if(baseUri){return URI.utils.resolve(baseUri,uri)}return uri}function safeUri(uri,prop,naiveUriRewriter){if(!naiveUriRewriter){return null}var parsed=(""+uri).match(URI_SCHEME_RE);if(parsed&&(!parsed[1]||ALLOWED_URI_SCHEMES.test(parsed[1]))){return naiveUriRewriter(uri,prop)}else{return null}}function withoutVendorPrefix(ident){return ident.replace(/^-(?:apple|css|epub|khtml|moz|mso?|o|rim|wap|webkit|xv)-(?=[a-z])/,"")}sanitizeCssProperty=function(){function unionArrays(arrs){var map={};for(var i=arrs.length;--i>=0;){var arr=arrs[i];for(var j=arr.length;--j>=0;){map[arr[j]]=ALLOWED_LITERAL}}return map}var ALLOWED_LITERAL={};return function sanitize(property,tokens,opt_naiveUriRewriter,opt_baseUri,opt_idSuffix){var propertyKey=withoutVendorPrefix(property);var propertySchema=cssSchema[propertyKey];if(!propertySchema||"object"!==typeof propertySchema){tokens.length=0;return}var propBits=propertySchema["cssPropBits"];function sanitizeFunctionCall(tokens,start){var parenDepth=1,end=start+1,n=tokens.length;while(end<n&&parenDepth){var token=tokens[end++];parenDepth+=token===")"?-1:/^[^"']*\($/.test(token)}if(!parenDepth){var fnToken=tokens[start].toLowerCase();var bareFnToken=withoutVendorPrefix(fnToken);var fnTokens=tokens.splice(start,end-start,"");var fns=propertySchema["cssFns"];for(var i=0,nFns=fns.length;i<nFns;++i){if(fns[i].substring(0,bareFnToken.length)==bareFnToken){fnTokens[0]=fnTokens[fnTokens.length-1]="";sanitize(fns[i],fnTokens,opt_naiveUriRewriter,opt_baseUri);return fnToken+fnTokens.join(" ")+")"}}}return""}var stringDisposition=propBits&(CSS_PROP_BIT_URL|CSS_PROP_BIT_UNRESERVED_WORD);var identDisposition=propBits&(CSS_PROP_BIT_GLOBAL_NAME|CSS_PROP_BIT_PROPERTY_NAME);var lastQuoted=NaN;var i=0,k=0;for(;i<tokens.length;++i){var token=tokens[i].toLowerCase();var cc=token.charCodeAt(0),cc1,cc2,isnum1,isnum2,end;var litGroup,litMap;token=cc===" ".charCodeAt(0)?"":cc==='"'.charCodeAt(0)?stringDisposition===CSS_PROP_BIT_URL?opt_naiveUriRewriter?normalizeUrl(safeUri(resolveUri(opt_baseUri,decodeCss(tokens[i].substring(1,token.length-1))),propertyKey,opt_naiveUriRewriter)):"":propBits&CSS_PROP_BIT_QSTRING&&!(stringDisposition&stringDisposition-1)?token:"":token==="inherit"?token:(litGroup=propertySchema["cssLitGroup"],litMap=litGroup?propertySchema["cssLitMap"]||(propertySchema["cssLitMap"]=unionArrays(litGroup)):ALLOWED_LITERAL,litMap[withoutVendorPrefix(token)]===ALLOWED_LITERAL)?token:cc==="#".charCodeAt(0)&&/^#(?:[0-9a-f]{3}){1,2}$/.test(token)?propBits&CSS_PROP_BIT_HASH_VALUE?token:"":"0".charCodeAt(0)<=cc&&cc<="9".charCodeAt(0)?propBits&CSS_PROP_BIT_QUANTITY?token:"":(cc1=token.charCodeAt(1),cc2=token.charCodeAt(2),isnum1="0".charCodeAt(0)<=cc1&&cc1<="9".charCodeAt(0),isnum2="0".charCodeAt(0)<=cc2&&cc2<="9".charCodeAt(0),cc==="+".charCodeAt(0)&&(isnum1||cc1===".".charCodeAt(0)&&isnum2))?propBits&CSS_PROP_BIT_QUANTITY?(isnum1?"":"0")+token.substring(1):"":cc==="-".charCodeAt(0)&&(isnum1||cc1===".".charCodeAt(0)&&isnum2)?propBits&CSS_PROP_BIT_NEGATIVE_QUANTITY?(isnum1?"-":"-0")+token.substring(1):propBits&CSS_PROP_BIT_QUANTITY?"0":"":cc===".".charCodeAt(0)&&isnum1?propBits&CSS_PROP_BIT_QUANTITY?"0"+token:"":'url("'===token.substring(0,5)?opt_naiveUriRewriter&&propBits&CSS_PROP_BIT_URL?normalizeUrl(safeUri(resolveUri(opt_baseUri,tokens[i].substring(5,token.length-2)),propertyKey,opt_naiveUriRewriter)):"":token.charAt(token.length-1)==="("?sanitizeFunctionCall(tokens,i):identDisposition&&/^-?[a-z_][\w\-]*$/.test(token)&&!/__$/.test(token)?opt_idSuffix&&identDisposition===CSS_PROP_BIT_GLOBAL_NAME?tokens[i]+opt_idSuffix:identDisposition===CSS_PROP_BIT_PROPERTY_NAME&&cssSchema[token]&&"number"===typeof cssSchema[token].cssPropBits?token:"":/^\w+$/.test(token)&&stringDisposition===CSS_PROP_BIT_UNRESERVED_WORD&&propBits&CSS_PROP_BIT_QSTRING?lastQuoted+1===k?(tokens[lastQuoted]=tokens[lastQuoted].substring(0,tokens[lastQuoted].length-1)+" "+token+'"',token=""):(lastQuoted=k,'"'+token+'"'):"";</span>&nbsp; <span class='diff-add'>if(token){tokens[k++]=token}}if(k===1&&tokens[0]===NOEFFECT_URL){k=0}tokens.length=k}}();var PSEUDO_SELECTOR_WHITELIST=new RegExp("^(active|after|before|blank|checked|default|disabled"+"|drop|empty|enabled|first|first-child|first-letter"+"|first-line|first-of-type|fullscreen|focus|hover"+"|in-range|indeterminate|invalid|last-child|last-of-type"+"|left|link|only-child|only-of-type|optional|out-of-range"+"|placeholder-shown|read-only|read-write|required|right"+"|root|scope|user-error|valid|visited"+")$");var COMBINATOR={};COMBINATOR[">"]=COMBINATOR["+"]=COMBINATOR["~"]=COMBINATOR;sanitizeCssSelectorList=function(selectors,virtualization,opt_onUntranslatableSelector){var containerClass=virtualization.containerClass;var idSuffix=virtualization.idSuffix;var tagPolicy=virtualization.tagPolicy;var sanitized=[];var k=0,i,inBrackets=0,tok;for(i=0;i<selectors.length;++i){tok=selectors[i];if(tok=="("||tok=="["?(++inBrackets,true):tok==")"||tok=="]"?(inBrackets&&--inBrackets,true):!(selectors[i]==" "&&(inBrackets||COMBINATOR[selectors[i-1]]===COMBINATOR||COMBINATOR[selectors[i+1]]===COMBINATOR))){selectors[k++]=selectors[i]}}selectors.length=k;var n=selectors.length,start=0;for(i=0;i<n;++i){if(selectors[i]===","){if(!processComplexSelector(start,i)){return null}start=i+1}}if(!processComplexSelector(start,n)){return null}function processComplexSelector(start,end){if(selectors[start]===" "){++start}if(end-1!==start&&selectors[end]===" "){--end}var out=[];var lastOperator=start;var valid=true;for(var i=start;valid&&i<end;++i){var tok=selectors[i];if(COMBINATOR[tok]===COMBINATOR||tok===" "){if(!processCompoundSelector(lastOperator,i,tok)){valid=false}else{lastOperator=i+1}}}if(!processCompoundSelector(lastOperator,end,"")){valid=false}function processCompoundSelector(start,end,combinator){var element,classId,attrs,pseudoSelector,tok,valid=true;element="";if(start<end){tok=selectors[start];if(tok==="*"){++start;element=tok}else if(/^[a-zA-Z]/.test(tok)){var decision=tagPolicy(tok.toLowerCase(),[]);if(decision){if("tagName"in decision){tok=decision["tagName"]}++start;element=tok}}}classId="";attrs="";pseudoSelector="";for(;valid&&start<end;++start){tok=selectors[start];if(tok.charAt(0)==="#"){if(/^#_|__$|[^\w#:\-]/.test(tok)){valid=false}else{classId+=tok+idSuffix}}else if(tok==="."){if(++start<end&&/^[0-9A-Za-z:_\-]+$/.test(tok=selectors[start])&&!/^_|__$/.test(tok)){classId+="."+tok}else{valid=false}}else if(start+1<end&&selectors[start]==="["){++start;var vAttr=selectors[start++].toLowerCase();var atype=html4.ATTRIBS[element+"::"+vAttr];if(atype!==+atype){atype=html4.ATTRIBS["*::"+vAttr]}var rAttr;if(virtualization.virtualizeAttrName){rAttr=virtualization.virtualizeAttrName(element,vAttr);if(typeof rAttr!=="string"){valid=false;rAttr=vAttr}if(valid&&atype!==+atype){atype=html4.atype["NONE"]}}else{rAttr=vAttr;if(atype!==+atype){valid=false}}var op="",value="",ignoreCase=false;if(/^[~^$*|]?=$/.test(selectors[start])){op=selectors[start++];value=selectors[start++];if(/^[0-9A-Za-z:_\-]+$/.test(value)){value='"'+value+'"'}else if(value==="]"){value='""';--start}if(!/^"([^\"\\]|\\.)*"$/.test(value)){valid=false}ignoreCase=selectors[start]==="i";if(ignoreCase){++start}}if(selectors[start]!=="]"){++start;valid=false}switch(atype){case html4.atype["CLASSES"]:case html4.atype["LOCAL_NAME"]:case html4.atype["NONE"]:break;case html4.atype["GLOBAL_NAME"]:case html4.atype["ID"]:case html4.atype["IDREF"]:if((op==="="||op==="~="||op==="$=")&&value!='""'&&!ignoreCase){value='"'+value.substring(1,value.length-1)+idSuffix+'"'}else if(op==="|="||op===""){}else{valid=false}break;case html4.atype["URI"]:case html4.atype["URI_FRAGMENT"]:if(op!==""){valid=false}break;default:valid=false}if(valid){attrs+="["+rAttr.replace(/[^\w-]/g,"\\$&")+op+value+(ignoreCase?" i]":"]")}}else if(start<end&&selectors[start]===":"){tok=selectors[++start];if(PSEUDO_SELECTOR_WHITELIST.test(tok)){pseudoSelector+=":"+tok}else{break}}else{break}}if(start!==end){valid=false}if(valid){var selector=(element+classId).replace(/[^ .*#\w-]/g,"\\$&")+attrs+pseudoSelector+combinator;if(selector){out.push(selector)}}return valid}if(valid){if(out.length){var safeSelector=out.join("");if(containerClass!==null){safeSelector="."+containerClass+" "+safeSelector}sanitized.push(safeSelector)}return true}else{return!opt_onUntranslatableSelector||opt_onUntranslatableSelector(selectors.slice(start,end))}}return sanitized};(function(){var MEDIA_TYPE="(?:"+"all|aural|braille|embossed|handheld|print"+"|projection|screen|speech|tty|tv"+")";var MEDIA_FEATURE="(?:"+"(?:min-|max-)?"+"(?:"+("(?:device-)?"+"(?:aspect-ratio|height|width)"+"|color(?:-index)?"+"|monochrome"+"|orientation"+"|resolution")+")"+"|grid"+"|hover"+"|luminosity"+"|pointer"+"|scan"+"|script"+")";var LENGTH_UNIT="(?:p[cxt]|[cem]m|in|dpi|dppx|dpcm|%)";var CSS_VALUE="-?(?:"+"[a-z]\\w+(?:-\\w+)*"+"|\\d+(?: / \\d+|(?:\\.\\d+)?"+LENGTH_UNIT+"?)"+")";var MEDIA_EXPR="\\( "+MEDIA_FEATURE+" (?:"+": "+CSS_VALUE+" )?\\)";var MEDIA_QUERY="(?:"+"(?:(?:(?:only|not) )?"+MEDIA_TYPE+"|"+MEDIA_EXPR+")"+"(?: and ?"+MEDIA_EXPR+")*"+")";var STARTS_WITH_KEYWORD_REGEXP=/^\w/;var MEDIA_QUERY_LIST_REGEXP=new RegExp("^"+MEDIA_QUERY+"(?: , "+MEDIA_QUERY+")*"+"$","i");sanitizeMediaQuery=function(cssTokens){cssTokens=cssTokens.slice();var nTokens=cssTokens.length,k=0;for(var i=0;i<nTokens;++i){var tok=cssTokens[i];if(tok!=" "){cssTokens[k++]=tok}}cssTokens.length=k;var css=cssTokens.join(" ");css=!css.length?"":!MEDIA_QUERY_LIST_REGEXP.test(css)?"not all":STARTS_WITH_KEYWORD_REGEXP.test(css)?css:"not all , "+css;return css}})();(function(){function cssParseUri(candidate){var string1=/^\s*["]([^"]*)["]\s*$/;var string2=/^\s*[']([^']*)[']\s*$/;var url1=/^\s*url\s*[(]["]([^"]*)["][)]\s*$/;var url2=/^\s*url\s*[(][']([^']*)['][)]\s*$/;var url3=/^\s*url\s*[(]([^)]*)[)]\s*$/;var match;if(match=string1.exec(candidate)){return match[1]}else if(match=string2.exec(candidate)){return match[1]}else if(match=url1.exec(candidate)){return match[1]}else if(match=url2.exec(candidate)){return match[1]}else if(match=url3.exec(candidate)){return match[1]}return null}function sanitizeStylesheetInternal(baseUri,cssText,virtualization,naiveUriRewriter,naiveUriFetcher,continuation,opt_importCount){var safeCss=void 0;var importCount=opt_importCount||[0];var blockStack=[];var elide=false;parseCssStylesheet(cssText,{startStylesheet:function(){safeCss=[]},endStylesheet:function(){},startAtrule:function(atIdent,headerArray){if(elide){atIdent=null}else if(atIdent==="@media"){safeCss.push("@media"," ",sanitizeMediaQuery(headerArray))}else if(atIdent==="@keyframes"||atIdent==="@-webkit-keyframes"){var animationId=headerArray[0];if(headerArray.length===1&&!/__$|[^\w\-]/.test(animationId)){safeCss.push(atIdent," ",animationId+virtualization.idSuffix);atIdent="@keyframes"}else{atIdent=null}}else{if(atIdent==="@import"&&headerArray.length>0){atIdent=null;if("function"===typeof continuation){var mediaQuery=sanitizeMediaQuery(headerArray.slice(1));if(mediaQuery!=="not all"){++importCount[0];var placeholder=[];safeCss.push(placeholder);var cssUrl=safeUri(resolveUri(baseUri,cssParseUri(headerArray[0])),function(result){var sanitized=sanitizeStylesheetInternal(cssUrl,result.html,virtualization,naiveUriRewriter,naiveUriFetcher,continuation,importCount);--importCount[0];var safeImportedCss=mediaQuery?{toString:function(){return"@media "+mediaQuery+" {"+sanitized.result+"}"}}:sanitized.result;placeholder[0]=safeImportedCss;continuation(safeImportedCss,!!importCount[0])},naiveUriFetcher)}}else{if(window.console){window.console.log("@import "+headerArray.join(" ")+" elided")}}}}elide=!atIdent;blockStack.push(atIdent)},endAtrule:function(){blockStack.pop();if(!elide){safeCss.push(";")}checkElide()},startBlock:function(){if(!elide){safeCss.push("{")}},endBlock:function(){if(!elide){safeCss.push("}");elide=true}},startRuleset:function(selectorArray){if(!elide){var selector=void 0;if(blockStack[blockStack.length-1]==="@keyframes"){selector=selectorArray.join(" ").match(/^ *(?:from|to|\d+(?:\.\d+)?%) *(?:, *(?:from|to|\d+(?:\.\d+)?%) *)*$/i);elide=!selector;if(selector){selector=selector[0].replace(/ +/g,"")}}else{var selectors=sanitizeCssSelectorList(selectorArray,virtualization);if(!selectors||!selectors.length){elide=true}else{selector=selectors.join(", ")}}if(!elide){safeCss.push(selector,"{")}}blockStack.push(null)},endRuleset:function(){blockStack.pop();if(!elide){safeCss.push("}")}checkElide()},declaration:function(property,valueArray){if(!elide){var isImportant=false;var nValues=valueArray.length;if(nValues>=2&&valueArray[nValues-2]==="!"&&valueArray[nValues-1].toLowerCase()==="important"){isImportant=true;valueArray.length-=2}sanitizeCssProperty(property,valueArray,naiveUriRewriter,baseUri,virtualization.idSuffix);if(valueArray.length){safeCss.push(property,":",valueArray.join(" "),isImportant?" !important;":";")}}}});function checkElide(){elide=blockStack.length&&blockStack[blockStack.length-1]===null}return{result:{toString:function(){return safeCss.join("")}},moreToCome:!!importCount[0]}}sanitizeStylesheet=function(baseUri,cssText,virtualization,naiveUriRewriter){return sanitizeStylesheetInternal(baseUri,cssText,virtualization,naiveUriRewriter,undefined,undefined).result.toString()};sanitizeStylesheetWithExternals=function(baseUri,cssText,virtualization,naiveUriRewriter,naiveUriFetcher,continuation){return sanitizeStylesheetInternal(baseUri,cssText,virtualization,naiveUriRewriter,naiveUriFetcher,continuation)}})()})();if(typeof window!=="undefined"){window["sanitizeCssProperty"]=sanitizeCssProperty;window["sanitizeCssSelectorList"]=sanitizeCssSelectorList;window["sanitizeStylesheet"]=sanitizeStylesheet;window["sanitizeMediaQuery"]=sanitizeMediaQuery}if("I".toLowerCase()!=="i"){throw"I/i problem"}var parseCssStylesheet;var parseCssDeclarations;(function(){parseCssStylesheet=function(cssText,handler){var toks=lexCss(cssText);if(handler["startStylesheet"]){handler["startStylesheet"]()}for(var i=0,n=toks.length;i<n;){i=toks[i]===" "?i+1:statement(toks,i,n,handler)}if(handler["endStylesheet"]){handler["endStylesheet"]()}};function statement(toks,i,n,handler){if(i<n){var tok=toks[i];if(tok.charAt(0)==="@"){return atrule(toks,i,n,handler,true)}else{return ruleset(toks,i,n,handler)}}else{return i}}function atrule(toks,i,n,handler,blockok){var start=i++;while(i<n&&toks[i]!=="{"&&toks[i]!==";"){++i}if(i<n&&(blockok||toks[i]===";")){var s=start+1,e=i;if(s<n&&toks[s]===" "){++s}if(e>s&&toks[e-1]===" "){--e}if(handler["startAtrule"]){handler["startAtrule"](toks[start].toLowerCase(),toks.slice(s,e))}i=toks[i]==="{"?block(toks,i,n,handler):i+1;if(handler["endAtrule"]){handler["endAtrule"]()}}return i}function block(toks,i,n,handler){++i;if(handler["startBlock"]){handler["startBlock"]()}while(i<n){var ch=toks[i].charAt(0);if(ch=="}"){++i;break}if(ch===" "||ch===";"){i=i+1}else if(ch==="@"){i=atrule(toks,i,n,handler,false)}else if(ch==="{"){i=block(toks,i,n,handler)}else{i=ruleset(toks,i,n,handler)}}if(handler["endBlock"]){handler["endBlock"]()}return i}function ruleset(toks,i,n,handler){var s=i,e=selector(toks,i,n,true);if(e<0){e=~e;return e===s?e+1:e}var tok=toks[e];if(tok!=="{"){return e===s?e+1:e}i=e+1;if(e>s&&toks[e-1]===" "){--e}if(handler["startRuleset"]){handler["startRuleset"](toks.slice(s,e))}while(i<n){tok=toks[i];if(tok==="}"){++i;break}if(tok===" "){i=i+1}else{i=declaration(toks,i,n,handler)}}if(handler["endRuleset"]){handler["endRuleset"]()}return i}function selector(toks,i,n,allowSemi){var s=i;var tok;var brackets=[],stackLast=-1;for(;i<n;++i){tok=toks[i].charAt(0);if(tok==="["||tok==="("){brackets[++stackLast]=tok}else if(tok==="]"&&brackets[stackLast]==="["||tok===")"&&brackets[stackLast]==="("){--stackLast}else if(tok==="{"||tok==="}"||tok===";"||tok==="@"||tok===":"&&!allowSemi){break}}if(stackLast>=0){i=~(i+1)}return i}var ident=/^-?[a-z]/i;function skipDeclaration(toks,i,n){while(i<n&&toks[i]!==";"&&toks[i]!=="}"){++i}return i<n&&toks[i]===";"?i+1:i}function declaration(toks,i,n,handler){var property=toks[i++];if(!ident.test(property)){return skipDeclaration(toks,i,n)}var tok;if(i<n&&toks[i]===" "){++i}if(i==n||toks[i]!==":"){return skipDeclaration(toks,i,n)}++i;if(i<n&&toks[i]===" "){++i}var s=i,e=selector(toks,i,n,false);if(e<0){e=~e}else{var value=[],valuelen=0;for(var j=s;j<e;++j){tok=toks[j];if(tok!==" "){value[valuelen++]=tok}}if(e<n){do{tok=toks[e];if(tok===";"||tok==="}"){break}valuelen=0}while(++e<n);if(tok===";"){++e}}if(valuelen&&handler["declaration"]){handler["declaration"](property.toLowerCase(),value)}}return e}parseCssDeclarations=function(cssText,handler){var toks=lexCss(cssText);for(var i=0,n=toks.length;i<n;){i=toks[i]!==" "?declaration(toks,i,n,handler):i+1}}})();if(typeof window!=="undefined"){window["parseCssStylesheet"]=parseCssStylesheet;window["parseCssDeclarations"]=parseCssDeclarations}var html4={};html4.atype={NONE:0,URI:1,URI_FRAGMENT:11,SCRIPT:2,STYLE:3,HTML:12,ID:4,IDREF:5,IDREFS:6,GLOBAL_NAME:7,LOCAL_NAME:8,CLASSES:9,FRAME_TARGET:10,MEDIA_QUERY:13};html4["atype"]=html4.atype;html4.ATTRIBS={"*::class":9,"*::dir":0,"*::draggable":0,"*::hidden":0,"*::id":4,"*::inert":0,"*::itemprop":0,"*::itemref":6,"*::itemscope":0,"*::lang":0,"*::onblur":2,"*::onchange":2,"*::onclick":2,"*::ondblclick":2,"*::onerror":2,"*::onfocus":2,"*::onkeydown":2,"*::onkeypress":2,"*::onkeyup":2,"*::onload":2,"*::onmousedown":2,"*::onmousemove":2,"*::onmouseout":2,"*::onmouseover":2,"*::onmouseup":2,"*::onreset":2,"*::onscroll":2,"*::onselect":2,"*::onsubmit":2,"*::ontouchcancel":2,"*::ontouchend":2,"*::ontouchenter":2,"*::ontouchleave":2,"*::ontouchmove":2,"*::ontouchstart":2,"*::onunload":2,"*::spellcheck":0,"*::style":3,"*::title":0,"*::translate":0,"a::accesskey":0,"a::coords":0,"a::href":1,"a::hreflang":0,"a::name":7,"a::onblur":2,"a::onfocus":2,"a::shape":0,"a::tabindex":0,"a::target":10,"a::type":0,"area::accesskey":0,"area::alt":0,"area::coords":0,"area::href":1,"area::nohref":0,"area::onblur":2,"area::onfocus":2,"area::shape":0,"area::tabindex":0,"area::target":10,"audio::controls":0,"audio::loop":0,"audio::mediagroup":5,"audio::muted":0,"audio::preload":0,"audio::src":1,"bdo::dir":0,"blockquote::cite":1,"br::clear":0,"button::accesskey":0,"button::disabled":0,"button::name":8,"button::onblur":2,"button::onfocus":2,"button::tabindex":0,"button::type":0,"button::value":0,"canvas::height":0,"canvas::width":0,"caption::align":0,"col::align":0,"col::char":0,"col::charoff":0,"col::span":0,"col::valign":0,"col::width":0,"colgroup::align":0,"colgroup::char":0,"colgroup::charoff":0,"colgroup::span":0,"colgroup::valign":0,"colgroup::width":0,"command::checked":0,"command::command":5,"command::disabled":0,"command::icon":1,"command::label":0,"command::radiogroup":0,"command::type":0,"data::value":0,"del::cite":1,"del::datetime":0,"details::open":0,"dir::compact":0,"div::align":0,"dl::compact":0,"fieldset::disabled":0,"font::color":0,"font::face":0,"font::size":0,"form::accept":0,"form::action":1,"form::autocomplete":0,"form::enctype":0,"form::method":0,"form::name":7,"form::novalidate":0,"form::onreset":2,"form::onsubmit":2,"form::target":10,"h1::align":0,"h2::align":0,"h3::align":0,"h4::align":0,"h5::align":0,"h6::align":0,"hr::align":0,"hr::noshade":0,"hr::size":0,"hr::width":0,"iframe::align":0,"iframe::frameborder":0,"iframe::height":0,"iframe::marginheight":0,"iframe::marginwidth":0,"iframe::width":0,"img::align":0,"img::alt":0,"img::border":0,"img::height":0,"img::hspace":0,"img::ismap":0,"img::name":7,"img::src":1,"img::usemap":11,"img::vspace":0,"img::width":0,"input::accept":0,"input::accesskey":0,"input::align":0,"input::alt":0,"input::autocomplete":0,"input::checked":0,"input::disabled":0,"input::inputmode":0,"input::ismap":0,"input::list":5,"input::max":0,"input::maxlength":0,"input::min":0,"input::multiple":0,"input::name":8,"input::onblur":2,"input::onchange":2,"input::onfocus":2,"input::onselect":2,"input::placeholder":0,"input::readonly":0,"input::required":0,"input::size":0,"input::src":1,"input::step":0,"input::tabindex":0,"input::type":0,"input::usemap":11,"input::value":0,"ins::cite":1,"ins::datetime":0,"label::accesskey":0,"label::for":5,"label::onblur":2,"label::onfocus":2,"legend::accesskey":0,"legend::align":0,"li::type":0,"li::value":0,"map::name":7,"menu::compact":0,"menu::label":0,"menu::type":0,"meter::high":0,"meter::low":0,"meter::max":0,"meter::min":0,"meter::value":0,"ol::compact":0,"ol::reversed":0,"ol::start":0,"ol::type":0,"optgroup::disabled":0,"optgroup::label":0,"option::disabled":0,"option::label":0,"option::selected":0,"option::value":0,"output::for":6,"output::name":8,"p::align":0,"pre::width":0,"progress::max":0,"progress::min":0,"progress::value":0,"q::cite":1,"select::autocomplete":0,"select::disabled":0,"select::multiple":0,"select::name":8,"select::onblur":2,"select::onchange":2,"select::onfocus":2,"select::required":0,"select::size":0,"select::tabindex":0,"source::type":0,"table::align":0,"table::bgcolor":0,"table::border":0,"table::cellpadding":0,"table::cellspacing":0,"table::frame":0,"table::rules":0,"table::summary":0,"table::width":0,"tbody::align":0,"tbody::char":0,"tbody::charoff":0,"tbody::valign":0,"td::abbr":0,"td::align":0,"td::axis":0,"td::bgcolor":0,"td::char":0,"td::charoff":0,"td::colspan":0,"td::headers":6,"td::height":0,"td::nowrap":0,"td::rowspan":0,"td::scope":0,"td::valign":0,"td::width":0,"textarea::accesskey":0,"textarea::autocomplete":0,"textarea::cols":0,"textarea::disabled":0,"textarea::inputmode":0,"textarea::name":8,"textarea::onblur":2,"textarea::onchange":2,"textarea::onfocus":2,"textarea::onselect":2,"textarea::placeholder":0,"textarea::readonly":0,"textarea::required":0,"textarea::rows":0,"textarea::tabindex":0,"textarea::wrap":0,"tfoot::align":0,"tfoot::char":0,"tfoot::charoff":0,"tfoot::valign":0,"th::abbr":0,"th::align":0,"th::axis":0,"th::bgcolor":0,"th::char":0,"th::charoff":0,"th::colspan":0,"th::headers":6,"th::height":0,"th::nowrap":0,"th::rowspan":0,"th::scope":0,"th::valign":0,"th::width":0,"thead::align":0,"thead::char":0,"thead::charoff":0,"thead::valign":0,"tr::align":0,"tr::bgcolor":0,"tr::char":0,"tr::charoff":0,"tr::valign":0,"track::default":0,"track::kind":0,"track::label":0,"track::srclang":0,"ul::compact":0,"ul::type":0,"video::controls":0,"video::height":0,"video::loop":0,"video::mediagroup":5,"video::muted":0,"video::poster":1,"video::preload":0,"video::src":1,"video::width":0};html4["ATTRIBS"]=html4.ATTRIBS;html4.eflags={OPTIONAL_ENDTAG:1,EMPTY:2,CDATA:4,RCDATA:8,UNSAFE:16,FOLDABLE:32,SCRIPT:64,STYLE:128,VIRTUALIZED:256};html4["eflags"]=html4.eflags;html4.ELEMENTS={a:0,abbr:0,acronym:0,address:0,applet:272,area:2,article:0,aside:0,audio:0,b:0,base:274,basefont:274,bdi:0,bdo:0,big:0,blockquote:0,body:305,br:2,button:0,canvas:0,caption:0,center:0,cite:0,code:0,col:2,colgroup:1,command:2,data:0,datalist:0,dd:1,del:0,details:0,dfn:0,dialog:272,dir:0,div:0,dl:0,dt:1,em:0,fieldset:0,figcaption:0,figure:0,font:0,footer:0,form:0,frame:274,frameset:272,h1:0,h2:0,h3:0,h4:0,h5:0,h6:0,head:305,header:0,hgroup:0,hr:2,html:305,i:0,iframe:4,img:2,input:2,ins:0,isindex:274,kbd:0,keygen:274,label:0,legend:0,li:1,link:274,map:0,mark:0,menu:0,meta:274,meter:0,nav:0,nobr:0,noembed:276,noframes:276,noscript:276,object:272,ol:0,optgroup:0,option:1,output:0,p:1,param:274,pre:0,progress:0,q:0,s:0,samp:0,script:84,section:0,select:0,small:0,source:2,span:0,strike:0,strong:0,style:148,sub:0,summary:0,sup:0,table:0,tbody:1,td:1,textarea:8,tfoot:1,th:1,thead:1,time:0,title:280,tr:1,track:2,tt:0,u:0,ul:0,"var":0,video:0,wbr:2};html4["ELEMENTS"]=html4.ELEMENTS;html4.ELEMENT_DOM_INTERFACES={a:"HTMLAnchorElement",abbr:"HTMLElement",acronym:"HTMLElement",address:"HTMLElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",article:"HTMLElement",aside:"HTMLElement",audio:"HTMLAudioElement",b:"HTMLElement",base:"HTMLBaseElement",basefont:"HTMLBaseFontElement",bdi:"HTMLElement",bdo:"HTMLElement",big:"HTMLElement",blockquote:"HTMLQuoteElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",center:"HTMLElement",cite:"HTMLElement",code:"HTMLElement",col:"HTMLTableColElement",colgroup:"HTMLTableColElement",command:"HTMLCommandElement",data:"HTMLElement",datalist:"HTMLDataListElement",dd:"HTMLElement",del:"HTMLModElement",details:"HTMLDetailsElement",dfn:"HTMLElement",dialog:"HTMLDialogElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",dt:"HTMLElement",em:"HTMLElement",fieldset:"HTMLFieldSetElement",figcaption:"HTMLElement",figure:"HTMLElement",font:"HTMLFontElement",footer:"HTMLElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",h2:"HTMLHeadingElement",h3:"HTMLHeadingElement",h4:"HTMLHeadingElement",h5:"HTMLHeadingElement",h6:"HTMLHeadingElement",head:"HTMLHeadElement",header:"HTMLElement",hgroup:"HTMLElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",i:"HTMLElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",ins:"HTMLModElement",isindex:"HTMLUnknownElement",kbd:"HTMLElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",mark:"HTMLElement",menu:"HTMLMenuElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",nav:"HTMLElement",nobr:"HTMLElement",noembed:"HTMLElement",noframes:"HTMLElement",noscript:"HTMLElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",s:"HTMLElement",samp:"HTMLElement",script:"HTMLScriptElement",section:"HTMLElement",select:"HTMLSelectElement",small:"HTMLElement",source:"HTMLSourceElement",span:"HTMLSpanElement",strike:"HTMLElement",strong:"HTMLElement",style:"HTMLStyleElement",sub:"HTMLElement",summary:"HTMLElement",sup:"HTMLElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",td:"HTMLTableDataCellElement",textarea:"HTMLTextAreaElement",tfoot:"HTMLTableSectionElement",th:"HTMLTableHeaderCellElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",tt:"HTMLElement",u:"HTMLElement",ul:"HTMLUListElement","var":"HTMLElement",video:"HTMLVideoElement",wbr:"HTMLElement"};html4["ELEMENT_DOM_INTERFACES"]=html4.ELEMENT_DOM_INTERFACES;html4.ueffects={NOT_LOADED:0,SAME_DOCUMENT:1,NEW_DOCUMENT:2};html4["ueffects"]=html4.ueffects;html4.URIEFFECTS={"a::href":2,"area::href":2,"audio::src":1,"blockquote::cite":0,"command::icon":1,"del::cite":0,"form::action":2,"img::src":1,"input::src":1,"ins::cite":0,"q::cite":0,"video::poster":1,"video::src":1};html4["URIEFFECTS"]=html4.URIEFFECTS;html4.ltypes={UNSANDBOXED:2,SANDBOXED:1,DATA:0};html4["ltypes"]=html4.ltypes;html4.LOADERTYPES={"a::href":2,"area::href":2,"audio::src":2,"blockquote::cite":2,"command::icon":1,"del::cite":2,"form::action":2,"img::src":1,"input::src":1,"ins::cite":2,"q::cite":2,"video::poster":1,"video::src":2};html4["LOADERTYPES"]=html4.LOADERTYPES;if(typeof window!=="undefined"){window["html4"]=html4}if("I".toLowerCase()!=="i"){throw"I/i problem"}var html=function(html4){var parseCssDeclarations,sanitizeCssProperty,cssSchema;if("undefined"!==typeof window){parseCssDeclarations=window["parseCssDeclarations"];sanitizeCssProperty=window["sanitizeCssProperty"];cssSchema=window["cssSchema"]}var ENTITIES={lt:"<",LT:"<",gt:">",GT:">",amp:"&",AMP:"&",quot:'"',apos:"'",nbsp:" "};var decimalEscapeRe=/^#(\d+)$/;var hexEscapeRe=/^#x([0-9A-Fa-f]+)$/;var safeEntityNameRe=/^[A-Za-z][A-za-z0-9]+$/;var entityLookupElement="undefined"!==typeof window&&window["document"]?window["document"].createElement("textarea"):null;function lookupEntity(name){if(ENTITIES.hasOwnProperty(name)){return ENTITIES[name]}var m=name.match(decimalEscapeRe);if(m){return String.fromCharCode(parseInt(m[1],10))}else if(!!(m=name.match(hexEscapeRe))){return String.fromCharCode(parseInt(m[1],16))}else if(entityLookupElement&&safeEntityNameRe.test(name)){entityLookupElement.innerHTML="&"+name+";";var text=entityLookupElement.textContent;ENTITIES[name]=text;return text}else{return"&"+name+";"}}function decodeOneEntity(_,name){return lookupEntity(name)}var nulRe=/\0/g;function stripNULs(s){return s.replace(nulRe,"")}var ENTITY_RE_1=/&(#[0-9]+|#[xX][0-9A-Fa-f]+|\w+);/g;var ENTITY_RE_2=/^(#[0-9]+|#[xX][0-9A-Fa-f]+|\w+);/;function unescapeEntities(s){return s.replace(ENTITY_RE_1,decodeOneEntity)}var ampRe=/&/g;var looseAmpRe=/&([^a-z#]|#(?:[^0-9x]|x(?:[^0-9a-f]|$)|$)|$)/gi;var ltRe=/[<]/g;var gtRe=/>/g;var quotRe=/\"/g;function escapeAttrib(s){return(""+s).replace(ampRe,"&amp;").replace(ltRe,"&lt;").replace(gtRe,"&gt;").replace(quotRe,"&#34;")}function normalizeRCData(rcdata){return rcdata.replace(looseAmpRe,"&amp;$1").replace(ltRe,"&lt;").replace(gtRe,"&gt;")}var ATTR_RE=new RegExp("^\\s*"+"([-.:\\w]+)"+"(?:"+("\\s*(=)\\s*"+"("+('(")[^"]*("|$)'+"|"+"(')[^']*('|$)"+"|"+"(?=[a-z][-\\w]*\\s*=)"+"|"+"[^\"'\\s]*")+")")+")?","i");var splitWillCapture="a,b".split(/(,)/).length===3;var EFLAGS_TEXT=html4.eflags["CDATA"]|html4.eflags["RCDATA"];function makeSaxParser(handler){var hcopy={cdata:handler.cdata||handler["cdata"],comment:handler.comment||handler["comment"],endDoc:handler.endDoc||handler["endDoc"],endTag:handler.endTag||handler["endTag"],pcdata:handler.pcdata||handler["pcdata"],rcdata:handler.rcdata||handler["rcdata"],startDoc:handler.startDoc||handler["startDoc"],startTag:handler.startTag||handler["startTag"]};return function(htmlText,param){return parse(htmlText,hcopy,param)}}var continuationMarker={};function parse(htmlText,handler,param){var m,p,tagName;var parts=htmlSplit(htmlText);var state={noMoreGT:false,noMoreEndComments:false};parseCPS(handler,parts,0,state,param)}function continuationMaker(h,parts,initial,state,param){return function(){parseCPS(h,parts,initial,state,param)}}function parseCPS(h,parts,initial,state,param){try{if(h.startDoc&&initial==0){h.startDoc(param)}var m,p,tagName;for(var pos=initial,end=parts.length;pos<end;){var current=parts[pos++];var next=parts[pos];switch(current){case"&":if(ENTITY_RE_2.test(next)){if(h.pcdata){h.pcdata("&"+next,param,continuationMarker,continuationMaker(h,parts,pos,state,param))}pos++}else{if(h.pcdata){h.pcdata("&amp;",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}break;case"</":if(m=/^([-\w:]+)[^\'\"]*/.exec(next)){if(m[0].length===next.length&&parts[pos+1]===">"){pos+=2;tagName=m[1].toLowerCase();if(h.endTag){h.endTag(tagName,param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}else{pos=parseEndTag(parts,pos,h,param,continuationMarker,state)}}else{if(h.pcdata){h.pcdata("&lt;/",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}break;case"<":if(m=/^([-\w:]+)\s*\/?/.exec(next)){if(m[0].length===next.length&&parts[pos+1]===">"){pos+=2;tagName=m[1].toLowerCase();if(h.startTag){h.startTag(tagName,[],param,continuationMarker,continuationMaker(h,parts,pos,state,param))}var eflags=html4.ELEMENTS[tagName];if(eflags&EFLAGS_TEXT){var tag={name:tagName,next:pos,eflags:eflags};pos=parseText(parts,tag,h,param,continuationMarker,state)}}else{pos=parseStartTag(parts,pos,h,param,continuationMarker,state)}}else{if(h.pcdata){h.pcdata("&lt;",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}break;case"<!--":if(!state.noMoreEndComments){for(p=pos+1;p<end;p++){if(parts[p]===">"&&/--$/.test(parts[p-1])){break}}if(p<end){if(h.comment){var comment=parts.slice(pos,p).join("");h.comment(comment.substr(0,comment.length-2),param,continuationMarker,continuationMaker(h,parts,p+1,state,param))}pos=p+1}else{state.noMoreEndComments=true}}if(state.noMoreEndComments){if(h.pcdata){h.pcdata("&lt;!--",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}break;case"<!":if(!/^\w/.test(next)){if(h.pcdata){h.pcdata("&lt;!",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}else{if(!state.noMoreGT){for(p=pos+1;p<end;p++){if(parts[p]===">"){break}}if(p<end){pos=p+1}else{state.noMoreGT=true}}if(state.noMoreGT){if(h.pcdata){h.pcdata("&lt;!",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}}break;case"<?":if(!state.noMoreGT){for(p=pos+1;p<end;p++){if(parts[p]===">"){break}}if(p<end){pos=p+1}else{state.noMoreGT=true}}if(state.noMoreGT){if(h.pcdata){h.pcdata("&lt;?",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}}break;case">":if(h.pcdata){h.pcdata("&gt;",param,continuationMarker,continuationMaker(h,parts,pos,state,param))}break;case"":break;default:if(h.pcdata){h.pcdata(current,param,continuationMarker,continuationMaker(h,parts,pos,state,param))}break}}if(h.endDoc){h.endDoc(param)}}catch(e){if(e!==continuationMarker){throw e}}}function htmlSplit(str){var re=/(<\/|<\!--|<[!?]|[&<>])/g;str+="";if(splitWillCapture){return str.split(re)}else{var parts=[];var lastPos=0;var m;while((m=re.exec(str))!==null){parts.push(str.substring(lastPos,m.index));parts.push(m[0]);lastPos=m.index+m[0].length}parts.push(str.substring(lastPos));return parts}}function parseEndTag(parts,pos,h,param,continuationMarker,state){var tag=parseTagAndAttrs(parts,pos);if(!tag){return parts.length}if(h.endTag){h.endTag(tag.name,param,continuationMarker,continuationMaker(h,parts,pos,state,param))}return tag.next}function parseStartTag(parts,pos,h,param,continuationMarker,state){var tag=parseTagAndAttrs(parts,pos);if(!tag){return parts.length}if(h.startTag){h.startTag(tag.name,tag.attrs,param,continuationMarker,continuationMaker(h,parts,tag.next,state,param))}if(tag.eflags&EFLAGS_TEXT){return parseText(parts,tag,h,param,continuationMarker,state)}else{return tag.next}}var endTagRe={};function parseText(parts,tag,h,param,continuationMarker,state){var end=parts.length;if(!endTagRe.hasOwnProperty(tag.name)){endTagRe[tag.name]=new RegExp("^"+tag.name+"(?:[\\s\\/]|$)","i")}var re=endTagRe[tag.name];var first=tag.next;var p=tag.next+1;for(;p<end;p++){if(parts[p-1]==="</"&&re.test(parts[p])){break}}if(p<end){p-=1}var buf=parts.slice(first,p).join("");if(tag.eflags&html4.eflags["CDATA"]){if(h.cdata){h.cdata(buf,param,continuationMarker,continuationMaker(h,parts,p,state,param))}}else if(tag.eflags&html4.eflags["RCDATA"]){if(h.rcdata){h.rcdata(normalizeRCData(buf),param,continuationMarker,continuationMaker(h,parts,p,state,param))}}else{throw new Error("bug")}return p}function parseTagAndAttrs(parts,pos){var m=/^([-\w:]+)/.exec(parts[pos]);var tag={};tag.name=m[1].toLowerCase();tag.eflags=html4.ELEMENTS[tag.name];var buf=parts[pos].substr(m[0].length);var p=pos+1;var end=parts.length;for(;p<end;p++){if(parts[p]===">"){break}buf+=parts[p]}if(end<=p){return void 0}var attrs=[];while(buf!==""){m=ATTR_RE.exec(buf);if(!m){buf=buf.replace(/^[\s\S][^a-z\s]*/,"")}else if(m[4]&&!m[5]||m[6]&&!m[7]){var quote=m[4]||m[6];var sawQuote=false;var abuf=[buf,parts[p++]];for(;p<end;p++){if(sawQuote){if(parts[p]===">"){break}}else if(0<=parts[p].indexOf(quote)){sawQuote=true}abuf.push(parts[p])}if(end<=p){break}buf=abuf.join("");continue}else{var aName=m[1].toLowerCase();var aValue=m[2]?decodeValue(m[3]):"";attrs.push(aName,aValue);buf=buf.substr(m[0].length)}}tag.attrs=attrs;tag.next=p+1;return tag}function decodeValue(v){var q=v.charCodeAt(0);if(q===34||q===39){v=v.substr(1,v.length-2)}return unescapeEntities(stripNULs(v))}function makeHtmlSanitizer(tagPolicy){var stack;var ignoring;var emit=function(text,out){if(!ignoring){out.push(text)}};return makeSaxParser({startDoc:function(_){stack=[];ignoring=false},startTag:function(tagNameOrig,attribs,out){if(ignoring){return}if(!html4.ELEMENTS.hasOwnProperty(tagNameOrig)){return}var eflagsOrig=html4.ELEMENTS[tagNameOrig];if(eflagsOrig&html4.eflags["FOLDABLE"]){return}var decision=tagPolicy(tagNameOrig,attribs);if(!decision){ignoring=!(eflagsOrig&html4.eflags["EMPTY"]);</span>&nbsp; <span class='diff-add'>return}else if(typeof decision!=="object"){throw new Error("tagPolicy did not return object (old API?)")}if("attribs"in decision){attribs=decision["attribs"]}else{throw new Error("tagPolicy gave no attribs")}var eflagsRep;var tagNameRep;if("tagName"in decision){tagNameRep=decision["tagName"];eflagsRep=html4.ELEMENTS[tagNameRep]}else{tagNameRep=tagNameOrig;eflagsRep=eflagsOrig}if(eflagsOrig&html4.eflags["OPTIONAL_ENDTAG"]){var onStack=stack[stack.length-1];if(onStack&&onStack.orig===tagNameOrig&&(onStack.rep!==tagNameRep||tagNameOrig!==tagNameRep)){out.push("</",onStack.rep,">")}}if(!(eflagsOrig&html4.eflags["EMPTY"])){stack.push({orig:tagNameOrig,rep:tagNameRep})}out.push("<",tagNameRep);for(var i=0,n=attribs.length;i<n;i+=2){var attribName=attribs[i],value=attribs[i+1];if(value!==null&&value!==void 0){out.push(" ",attribName,'="',escapeAttrib(value),'"')}}out.push(">");if(eflagsOrig&html4.eflags["EMPTY"]&&!(eflagsRep&html4.eflags["EMPTY"])){out.push("</",tagNameRep,">")}},endTag:function(tagName,out){if(ignoring){ignoring=false;return}if(!html4.ELEMENTS.hasOwnProperty(tagName)){return}var eflags=html4.ELEMENTS[tagName];if(!(eflags&(html4.eflags["EMPTY"]|html4.eflags["FOLDABLE"]))){var index;if(eflags&html4.eflags["OPTIONAL_ENDTAG"]){for(index=stack.length;--index>=0;){var stackElOrigTag=stack[index].orig;if(stackElOrigTag===tagName){break}if(!(html4.ELEMENTS[stackElOrigTag]&html4.eflags["OPTIONAL_ENDTAG"])){return}}}else{for(index=stack.length;--index>=0;){if(stack[index].orig===tagName){break}}}if(index<0){return}for(var i=stack.length;--i>index;){var stackElRepTag=stack[i].rep;if(!(html4.ELEMENTS[stackElRepTag]&html4.eflags["OPTIONAL_ENDTAG"])){out.push("</",stackElRepTag,">")}}if(index<stack.length){tagName=stack[index].rep}stack.length=index;out.push("</",tagName,">")}},pcdata:emit,rcdata:emit,cdata:emit,endDoc:function(out){for(;stack.length;stack.length--){out.push("</",stack[stack.length-1].rep,">")}}})}var ALLOWED_URI_SCHEMES=/^(?:https?|mailto)$/i;function safeUri(uri,effect,ltype,hints,naiveUriRewriter){if(!naiveUriRewriter){return null}try{var parsed=URI.parse(""+uri);if(parsed){if(!parsed.hasScheme()||ALLOWED_URI_SCHEMES.test(parsed.getScheme())){var safe=naiveUriRewriter(parsed,effect,ltype,hints);return safe?safe.toString():null}}}catch(e){return null}return null}function log(logger,tagName,attribName,oldValue,newValue){if(!attribName){logger(tagName+" removed",{change:"removed",tagName:tagName})}if(oldValue!==newValue){var changed="changed";if(oldValue&&!newValue){changed="removed"}else if(!oldValue&&newValue){changed="added"}logger(tagName+"."+attribName+" "+changed,{change:changed,tagName:tagName,attribName:attribName,oldValue:oldValue,newValue:newValue})}}function lookupAttribute(map,tagName,attribName){var attribKey;attribKey=tagName+"::"+attribName;if(map.hasOwnProperty(attribKey)){return map[attribKey]}attribKey="*::"+attribName;if(map.hasOwnProperty(attribKey)){return map[attribKey]}return void 0}function getAttributeType(tagName,attribName){return lookupAttribute(html4.ATTRIBS,tagName,attribName)}function getLoaderType(tagName,attribName){return lookupAttribute(html4.LOADERTYPES,tagName,attribName)}function getUriEffect(tagName,attribName){return lookupAttribute(html4.URIEFFECTS,tagName,attribName)}function sanitizeAttribs(tagName,attribs,opt_naiveUriRewriter,opt_nmTokenPolicy,opt_logger){for(var i=0;i<attribs.length;i+=2){var attribName=attribs[i];var value=attribs[i+1];var oldValue=value;var atype=null,attribKey;if((attribKey=tagName+"::"+attribName,html4.ATTRIBS.hasOwnProperty(attribKey))||(attribKey="*::"+attribName,html4.ATTRIBS.hasOwnProperty(attribKey))){atype=html4.ATTRIBS[attribKey]}if(atype!==null){switch(atype){case html4.atype["NONE"]:break;case html4.atype["SCRIPT"]:value=null;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break;case html4.atype["STYLE"]:if("undefined"===typeof parseCssDeclarations){value=null;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break}var sanitizedDeclarations=[];parseCssDeclarations(value,{declaration:function(property,tokens){var normProp=property.toLowerCase();sanitizeCssProperty(normProp,tokens,opt_naiveUriRewriter?function(url){return safeUri(url,html4.ueffects.SAME_DOCUMENT,html4.ltypes.SANDBOXED,{TYPE:"CSS",CSS_PROP:normProp},opt_naiveUriRewriter)}:null);if(tokens.length){sanitizedDeclarations.push(normProp+": "+tokens.join(" "))}}});value=sanitizedDeclarations.length>0?sanitizedDeclarations.join(" ; "):null;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break;case html4.atype["ID"]:case html4.atype["IDREF"]:case html4.atype["IDREFS"]:case html4.atype["GLOBAL_NAME"]:case html4.atype["LOCAL_NAME"]:case html4.atype["CLASSES"]:value=opt_nmTokenPolicy?opt_nmTokenPolicy(value):value;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break;case html4.atype["URI"]:value=safeUri(value,getUriEffect(tagName,attribName),getLoaderType(tagName,attribName),{TYPE:"MARKUP",XML_ATTR:attribName,XML_TAG:tagName},opt_naiveUriRewriter);if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break;case html4.atype["URI_FRAGMENT"]:if(value&&"#"===value.charAt(0)){value=value.substring(1);value=opt_nmTokenPolicy?opt_nmTokenPolicy(value):value;if(value!==null&&value!==void 0){value="#"+value}}else{value=null}if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break;default:value=null;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}break}}else{value=null;if(opt_logger){log(opt_logger,tagName,attribName,oldValue,value)}}attribs[i+1]=value}return attribs}function makeTagPolicy(opt_naiveUriRewriter,opt_nmTokenPolicy,opt_logger){return function(tagName,attribs){if(!(html4.ELEMENTS[tagName]&html4.eflags["UNSAFE"])){return{attribs:sanitizeAttribs(tagName,attribs,opt_naiveUriRewriter,opt_nmTokenPolicy,opt_logger)}}else{if(opt_logger){log(opt_logger,tagName,undefined,undefined,undefined)}}}}function sanitizeWithPolicy(inputHtml,tagPolicy){var outputArray=[];makeHtmlSanitizer(tagPolicy)(inputHtml,outputArray);return outputArray.join("")}function sanitize(inputHtml,opt_naiveUriRewriter,opt_nmTokenPolicy,opt_logger){var tagPolicy=makeTagPolicy(opt_naiveUriRewriter,opt_nmTokenPolicy,opt_logger);return sanitizeWithPolicy(inputHtml,tagPolicy)}var html={};html.escapeAttrib=html["escapeAttrib"]=escapeAttrib;html.makeHtmlSanitizer=html["makeHtmlSanitizer"]=makeHtmlSanitizer;html.makeSaxParser=html["makeSaxParser"]=makeSaxParser;html.makeTagPolicy=html["makeTagPolicy"]=makeTagPolicy;html.normalizeRCData=html["normalizeRCData"]=normalizeRCData;html.sanitize=html["sanitize"]=sanitize;html.sanitizeAttribs=html["sanitizeAttribs"]=sanitizeAttribs;html.sanitizeWithPolicy=html["sanitizeWithPolicy"]=sanitizeWithPolicy;html.unescapeEntities=html["unescapeEntities"]=unescapeEntities;return html}(html4);var html_sanitize=html["sanitize"];if(typeof window!=="undefined"){window["html"]=html;window["html_sanitize"]=html_sanitize}</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/init.js b/ipynb/Array-feature-overlap-05_files/init.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..9dde6b0</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/init.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/manager",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_link",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_bool",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_button",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_box",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_float",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_image",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_int",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_output",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_selection",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_selectioncontainer",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_string",</span>&nbsp; <span class='diff-add'>], function(widgetmanager, linkModels) {</span>&nbsp; <span class='diff-add'> for (var target_name in linkModels) {</span>&nbsp; <span class='diff-add'> if (linkModels.hasOwnProperty(target_name)) {</span>&nbsp; <span class='diff-add'> widgetmanager.WidgetManager.register_widget_model(target_name, linkModels[target_name]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Register all of the loaded views with the widget manager.</span>&nbsp; <span class='diff-add'> for (var i = 2; i < arguments.length; i++) {</span>&nbsp; <span class='diff-add'> for (var target_name in arguments[i]) {</span>&nbsp; <span class='diff-add'> if (arguments[i].hasOwnProperty(target_name)) {</span>&nbsp; <span class='diff-add'> widgetmanager.WidgetManager.register_widget_view(target_name, arguments[i][target_name]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {'WidgetManager': widgetmanager.WidgetManager}; </span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/jquery-ui.min.css b/ipynb/Array-feature-overlap-05_files/jquery-ui.min.css</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..b8b6f0a</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/jquery-ui.min.css</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*! jQuery UI - v1.10.3 - 2013-05-03</span>&nbsp; <span class='diff-add'>* http://jqueryui.com</span>&nbsp; <span class='diff-add'>* Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css</span>&nbsp; <span class='diff-add'>* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px</span>&nbsp; <span class='diff-add'>* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(images/animated-overlay.gif);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:0;background:0;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:0;border-bottom:0;border-right:0}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/jquery-ui.min.js b/ipynb/Array-feature-overlap-05_files/jquery-ui.min.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..82bbb67</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/jquery-ui.min.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*! jQuery UI - v1.10.3 - 2013-05-03</span>&nbsp; <span class='diff-add'>* http://jqueryui.com</span>&nbsp; <span class='diff-add'>* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js</span>&nbsp; <span class='diff-add'>* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */</span>&nbsp; <span class='diff-add'>(function(t,e){function i(e,i){var n,o,a,r=e.nodeName.toLowerCase();return"area"===r?(n=e.parentNode,o=n.name,e.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap=#"+o+"]")[0],!!a&&s(a)):!1):(/input|select|textarea|button|object/.test(r)?!e.disabled:"a"===r?e.href||i:i)&&s(e)}function s(e){return t.expr.filters.visible(e)&&!t(e).parents().addBack().filter(function(){return"hidden"===t.css(this,"visibility")}).length}var n=0,o=/^ui-id-\d+$/;t.ui=t.ui||{},t.extend(t.ui,{version:"1.10.3",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),t.fn.extend({focus:function(e){return function(i,s){return"number"==typeof i?this.each(function(){var e=this;setTimeout(function(){t(e).focus(),s&&s.call(e)},i)}):e.apply(this,arguments)}}(t.fn.focus),scrollParent:function(){var e;return e=t.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(t.css(this,"position"))&&/(auto|scroll)/.test(t.css(this,"overflow")+t.css(this,"overflow-y")+t.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(t.css(this,"overflow")+t.css(this,"overflow-y")+t.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!e.length?t(document):e},zIndex:function(i){if(i!==e)return this.css("zIndex",i);if(this.length)for(var s,n,o=t(this[0]);o.length&&o[0]!==document;){if(s=o.css("position"),("absolute"===s||"relative"===s||"fixed"===s)&&(n=parseInt(o.css("zIndex"),10),!isNaN(n)&&0!==n))return n;o=o.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++n)})},removeUniqueId:function(){return this.each(function(){o.test(this.id)&&t(this).removeAttr("id")})}}),t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])},focusable:function(e){return i(e,!isNaN(t.attr(e,"tabindex")))},tabbable:function(e){var s=t.attr(e,"tabindex"),n=isNaN(s);return(n||s>=0)&&i(e,!n)}}),t("<a>").outerWidth(1).jquery||t.each(["Width","Height"],function(i,s){function n(e,i,s,n){return t.each(o,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),n&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var o="Width"===s?["Left","Right"]:["Top","Bottom"],a=s.toLowerCase(),r={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+s]=function(i){return i===e?r["inner"+s].call(this):this.each(function(){t(this).css(a,n(this,i)+"px")})},t.fn["outer"+s]=function(e,i){return"number"!=typeof e?r["outer"+s].call(this,e):this.each(function(){t(this).css(a,n(this,e,!0,i)+"px")})}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(t.fn.removeData=function(e){return function(i){return arguments.length?e.call(this,t.camelCase(i)):e.call(this)}}(t.fn.removeData)),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),t.support.selectstart="onselectstart"in document.createElement("div"),t.fn.extend({disableSelection:function(){return this.bind((t.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(t){t.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),t.extend(t.ui,{plugin:{add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i){var s,n=t.plugins[e];if(n&&t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType)for(s=0;n.length>s;s++)t.options[n[s][0]]&&n[s][1].apply(t.element,i)}},hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)}})})(jQuery),function(t,e){var i=0,s=Array.prototype.slice,n=t.cleanData;t.cleanData=function(e){for(var i,s=0;null!=(i=e[s]);s++)try{t(i).triggerHandler("remove")}catch(o){}n(e)},t.widget=function(i,s,n){var o,a,r,h,l={},c=i.split(".")[0];i=i.split(".")[1],o=c+"-"+i,n||(n=s,s=t.Widget),t.expr[":"][o.toLowerCase()]=function(e){return!!t.data(e,o)},t[c]=t[c]||{},a=t[c][i],r=t[c][i]=function(t,i){return this._createWidget?(arguments.length&&this._createWidget(t,i),e):new r(t,i)},t.extend(r,a,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),h=new s,h.options=t.widget.extend({},h.options),t.each(n,function(i,n){return t.isFunction(n)?(l[i]=function(){var t=function(){return s.prototype[i].apply(this,arguments)},e=function(t){return s.prototype[i].apply(this,t)};return function(){var i,s=this._super,o=this._superApply;return this._super=t,this._superApply=e,i=n.apply(this,arguments),this._super=s,this._superApply=o,i}}(),e):(l[i]=n,e)}),r.prototype=t.widget.extend(h,{widgetEventPrefix:a?h.widgetEventPrefix:i},l,{constructor:r,namespace:c,widgetName:i,widgetFullName:o}),a?(t.each(a._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,r,i._proto)}),delete a._childConstructors):s._childConstructors.push(r),t.widget.bridge(i,r)},t.widget.extend=function(i){for(var n,o,a=s.call(arguments,1),r=0,h=a.length;h>r;r++)for(n in a[r])o=a[r][n],a[r].hasOwnProperty(n)&&o!==e&&(i[n]=t.isPlainObject(o)?t.isPlainObject(i[n])?t.widget.extend({},i[n],o):t.widget.extend({},o):o);return i},t.widget.bridge=function(i,n){var o=n.prototype.widgetFullName||i;t.fn[i]=function(a){var r="string"==typeof a,h=s.call(arguments,1),l=this;return a=!r&&h.length?t.widget.extend.apply(null,[a].concat(h)):a,r?this.each(function(){var s,n=t.data(this,o);return n?t.isFunction(n[a])&&"_"!==a.charAt(0)?(s=n[a].apply(n,h),s!==n&&s!==e?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):e):t.error("no such method '"+a+"' for "+i+" widget instance"):t.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+a+"'")}):this.each(function(){var e=t.data(this,o);e?e.option(a||{})._init():t.data(this,o,new n(a,this))}),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this.bindings=t(),this.hoverable=t(),this.focusable=t(),s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(i,s){var n,o,a,r=i;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof i)if(r={},n=i.split("."),i=n.shift(),n.length){for(o=r[i]=t.widget.extend({},this.options[i]),a=0;n.length-1>a;a++)o[n[a]]=o[n[a]]||{},o=o[n[a]];if(i=n.pop(),s===e)return o[i]===e?null:o[i];o[i]=s}else{if(s===e)return this.options[i]===e?null:this.options[i];r[i]=s}return this._setOptions(r),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!e).attr("aria-disabled",e),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var o,a=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=o=t(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,o=this.widget()),t.each(n,function(n,r){function h(){return i||a.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof r?a[r]:r).apply(a,arguments):e}"string"!=typeof r&&(h.guid=r.guid=r.guid||h.guid||t.guid++);var l=n.match(/^(\w+)\s*(.*)$/),c=l[1]+a.eventNamespace,u=l[2];u?o.delegate(u,c,h):s.bind(c,h)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(e).undelegate(e)},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}})}(jQuery),function(t){var e=!1;t(document).mouseup(function(){e=!1}),t.widget("ui.mouse",{version:"1.10.3",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.bind("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).bind("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!e){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,o="string"==typeof this.options.cancel&&i.target.nodeName?t(i.target).closest(this.options.cancel).length:!1;return n&&!o&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===t.data(i.target,this.widgetName+".preventClickEvent")&&t.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return s._mouseMove(t)},this._mouseUpDelegate=function(t){return s._mouseUp(t)},t(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),e=!0,!0)):!0}},_mouseMove:function(e){return t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button?this._mouseUp(e):this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){return t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),!1},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})}(jQuery),function(t){t.widget("ui.draggable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},_destroy:function(){this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy()},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(t(i.iframeFix===!0?"iframe":i.iframeFix).each(function(){t("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(t(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_mouseDrag:function(e,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"original"!==this.options.helper||t.contains(this.element[0].ownerDocument,this.element[0])?("invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1):!1},_mouseUp:function(e){return t("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return s.parents("body").length||s.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s[0]===this.element[0]||/(fixed|absolute)/.test(s.css("position"))||s.css("position","absolute"),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.element.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;return n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):"document"===n.containment?(this.containment=[0,0,t(document).width()-this.helperProportions.width-this.margins.left,(t(document).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):n.containment.constructor===Array?(this.containment=n.containment,undefined):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=i),undefined):(this.containment=null,undefined)},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent;return this.offset.scroll||(this.offset.scroll={top:n.scrollTop(),left:n.scrollLeft()}),{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top)*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)*s}},_generatePosition:function(e){var i,s,n,o,a=this.options,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=e.pageX,l=e.pageY;return this.offset.scroll||(this.offset.scroll={top:r.scrollTop(),left:r.scrollLeft()}),this.originalPosition&&(this.containment&&(this.relative_container?(s=this.relative_container.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,h=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s]),"drag"===e&&(this.positionAbs=this._convertPositionTo("absolute")),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i){var s=t(this).data("ui-draggable"),n=s.options,o=t.extend({},i,{item:s.element});s.sortables=[],t(n.connectToSortable).each(function(){var i=t.data(this,"ui-sortable");i&&!i.options.disabled&&(s.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",e,o))})},stop:function(e,i){var s=t(this).data("ui-draggable"),n=t.extend({},i,{item:s.element});t.each(s.sortables,function(){this.instance.isOver?(this.instance.isOver=0,s.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(e),this.instance.options.helper=this.instance.options._helper,"original"===s.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",e,n))})},drag:function(e,i){var s=t(this).data("ui-draggable"),n=this;t.each(s.sortables,function(){var o=!1,a=this;this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(o=!0,t.each(s.sortables,function(){return this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this!==a&&this.instance._intersectsWith(this.instance.containerCache)&&t.contains(a.instance.element[0],this.instance.element[0])&&(o=!1),o})),o?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=t(n).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},e.target=this.instance.currentItem[0],this.instance._mouseCapture(e,!0),this.instance._mouseStart(e,!0,!0),this.instance.offset.click.top=s.offset.click.top,this.instance.offset.click.left=s.offset.click.left,this.instance.offset.parent.left-=s.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=s.offset.parent.top-this.instance.offset.parent.top,s._trigger("toSortable",e),s.dropped=this.instance.element,s.currentItem=s.element,this.instance.fromOutside=s),this.instance.currentItem&&this.instance._mouseDrag(e)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",e,this.instance._uiHash(this.instance)),this.instance._mouseStop(e,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),s._trigger("fromSortable",e),s.dropped=!1)})}}),t.ui.plugin.add("draggable","cursor",{start:function(){var e=t("body"),i=t(this).data("ui-draggable").options;e.css("cursor")&&(i._cursor=e.css("cursor")),e.css("cursor",i.cursor)},stop:function(){var e=t(this).data("ui-draggable").options;e._cursor&&t("body").css("cursor",e._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i){var s=t(i.helper),n=t(this).data("ui-draggable").options;s.css("opacity")&&(n._opacity=s.css("opacity")),s.css("opacity",n.opacity)},stop:function(e,i){var s=t(this).data("ui-draggable").options;s._opacity&&t(i.helper).css("opacity",s._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(){var e=t(this).data("ui-draggable");e.scrollParent[0]!==document&&"HTML"!==e.scrollParent[0].tagName&&(e.overflowOffset=e.scrollParent.offset())},drag:function(e){var i=t(this).data("ui-draggable"),s=i.options,n=!1;i.scrollParent[0]!==document&&"HTML"!==i.scrollParent[0].tagName?(s.axis&&"x"===s.axis||(i.overflowOffset.top+i.scrollParent[0].offsetHeight-e.pageY<s.scrollSensitivity?i.scrollParent[0].scrollTop=n=i.scrollParent[0].scrollTop+s.scrollSpeed:e.pageY-i.overflowOffset.top<s.scrollSensitivity&&(i.scrollParent[0].scrollTop=n=i.scrollParent[0].scrollTop-s.scrollSpeed)),s.axis&&"y"===s.axis||(i.overflowOffset.left+i.scrollParent[0].offsetWidth-e.pageX<s.scrollSensitivity?i.scrollParent[0].scrollLeft=n=i.scrollParent[0].scrollLeft+s.scrollSpeed:e.pageX-i.overflowOffset.left<s.scrollSensitivity&&(i.scrollParent[0].scrollLeft=n=i.scrollParent[0].scrollLeft-s.scrollSpeed))):(s.axis&&"x"===s.axis||(e.pageY-t(document).scrollTop()<s.scrollSensitivity?n=t(document).scrollTop(t(document).scrollTop()-s.scrollSpeed):t(window).height()-(e.pageY-t(document).scrollTop())<s.scrollSensitivity&&(n=t(document).scrollTop(t(document).scrollTop()+s.scrollSpeed))),s.axis&&"y"===s.axis||(e.pageX-t(document).scrollLeft()<s.scrollSensitivity?n=t(document).scrollLeft(t(document).scrollLeft()-s.scrollSpeed):t(window).width()-(e.pageX-t(document).scrollLeft())<s.scrollSensitivity&&(n=t(document).scrollLeft(t(document).scrollLeft()+s.scrollSpeed)))),n!==!1&&t.ui.ddmanager&&!s.dropBehaviour&&t.ui.ddmanager.prepareOffsets(i,e)}}),t.ui.plugin.add("draggable","snap",{start:function(){var e=t(this).data("ui-draggable"),i=e.options;e.snapElements=[],t(i.snap.constructor!==String?i.snap.items||":data(ui-draggable)":i.snap).each(function(){var i=t(this),s=i.offset();this!==e.element[0]&&e.snapElements.push({item:this,width:i.outerWidth(),height:i.outerHeight(),top:s.top,left:s.left})})},drag:function(e,i){var s,n,o,a,r,h,l,c,u,d,p=t(this).data("ui-draggable"),f=p.options,g=f.snapTolerance,m=i.offset.left,v=m+p.helperProportions.width,_=i.offset.top,b=_+p.helperProportions.height;for(u=p.snapElements.length-1;u>=0;u--)r=p.snapElements[u].left,h=r+p.snapElements[u].width,l=p.snapElements[u].top,c=l+p.snapElements[u].height,r-g>v||m>h+g||l-g>b||_>c+g||!t.contains(p.snapElements[u].item.ownerDocument,p.snapElements[u].item)?(p.snapElements[u].snapping&&p.options.snap.release&&p.options.snap.release.call(p.element,e,t.extend(p._uiHash(),{snapItem:p.snapElements[u].item})),p.snapElements[u].snapping=!1):("inner"!==f.snapMode&&(s=g>=Math.abs(l-b),n=g>=Math.abs(c-_),o=g>=Math.abs(r-v),a=g>=Math.abs(h-m),s&&(i.position.top=p._convertPositionTo("relative",{top:l-p.helperProportions.height,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:c,left:0}).top-p.margins.top),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r-p.helperProportions.width}).left-p.margins.left),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:h}).left-p.margins.left)),d=s||n||o||a,"outer"!==f.snapMode&&(s=g>=Math.abs(l-_),n=g>=Math.abs(c-b),o=g>=Math.abs(r-m),a=g>=Math.abs(h-v),s&&(i.position.top=p._convertPositionTo("relative",{top:l,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:c-p.helperProportions.height,left:0}).top-p.margins.top),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r}).left-p.margins.left),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:h-p.helperProportions.width}).left-p.margins.left)),!p.snapElements[u].snapping&&(s||n||o||a||d)&&p.options.snap.snap&&p.options.snap.snap.call(p.element,e,t.extend(p._uiHash(),{snapItem:p.snapElements[u].item})),p.snapElements[u].snapping=s||n||o||a||d)}}),t.ui.plugin.add("draggable","stack",{start:function(){var e,i=this.data("ui-draggable").options,s=t.makeArray(t(i.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});s.length&&(e=parseInt(t(s[0]).css("zIndex"),10)||0,t(s).each(function(i){t(this).css("zIndex",e+i)}),this.css("zIndex",e+s.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i){var s=t(i.helper),n=t(this).data("ui-draggable").options;s.css("zIndex")&&(n._zIndex=s.css("zIndex")),s.css("zIndex",n.zIndex)},stop:function(e,i){var s=t(this).data("ui-draggable").options;s._zIndex&&t(i.helper).css("zIndex",s._zIndex)}})}(jQuery),function(t){function e(t,e,i){return t>e&&e+i>t}t.widget("ui.droppable",{version:"1.10.3",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e=this.options,i=e.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(i)?i:function(t){return t.is(i)</span>&nbsp; <span class='diff-add'>},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},t.ui.ddmanager.droppables[e.scope]=t.ui.ddmanager.droppables[e.scope]||[],t.ui.ddmanager.droppables[e.scope].push(this),e.addClasses&&this.element.addClass("ui-droppable")},_destroy:function(){for(var e=0,i=t.ui.ddmanager.droppables[this.options.scope];i.length>e;e++)i[e]===this&&i.splice(e,1);this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(e,i){"accept"===e&&(this.accept=t.isFunction(i)?i:function(t){return t.is(i)}),t.Widget.prototype._setOption.apply(this,arguments)},_activate:function(e){var i=t.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var e=t.data(this,"ui-droppable");return e.options.greedy&&!e.options.disabled&&e.options.scope===s.options.scope&&e.accept.call(e.element[0],s.currentItem||s.element)&&t.ui.intersect(s,t.extend(e,{offset:e.element.offset()}),e.options.tolerance)?(n=!0,!1):undefined}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}}}),t.ui.intersect=function(t,i,s){if(!i.offset)return!1;var n,o,a=(t.positionAbs||t.position.absolute).left,r=a+t.helperProportions.width,h=(t.positionAbs||t.position.absolute).top,l=h+t.helperProportions.height,c=i.offset.left,u=c+i.proportions.width,d=i.offset.top,p=d+i.proportions.height;switch(s){case"fit":return a>=c&&u>=r&&h>=d&&p>=l;case"intersect":return a+t.helperProportions.width/2>c&&u>r-t.helperProportions.width/2&&h+t.helperProportions.height/2>d&&p>l-t.helperProportions.height/2;case"pointer":return n=(t.positionAbs||t.position.absolute).left+(t.clickOffset||t.offset.click).left,o=(t.positionAbs||t.position.absolute).top+(t.clickOffset||t.offset.click).top,e(o,d,i.proportions.height)&&e(n,c,i.proportions.width);case"touch":return(h>=d&&p>=h||l>=d&&p>=l||d>h&&l>p)&&(a>=c&&u>=a||r>=c&&u>=r||c>a&&r>u);default:return!1}},t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions.height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions={width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight})}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&t.ui.intersect(e,this,this.options.tolerance)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").bind("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,a=t.ui.intersect(e,this,this.options.tolerance),r=!a&&this.isover?"isout":a&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t.data(this,"ui-droppable").options.scope===n}),o.length&&(s=t.data(o[0],"ui-droppable"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").unbind("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}}}(jQuery),function(t){function e(t){return parseInt(t,10)||0}function i(t){return!isNaN(parseInt(t,10))}t.widget("ui.resizable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_create:function(){var e,i,s,n,o,a=this,r=this.options;if(this.element.addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.data("ui-resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),e=this.handles.split(","),this.handles={},i=0;e.length>i;i++)s=t.trim(e[i]),o="ui-resizable-"+s,n=t("<div class='ui-resizable-handle "+o+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=t(this.handles[i],this.element).show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),t(this.handles[i]).length},this._renderAxis(this.element),this._handles=t(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){a.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),a.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),t(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(t(this).removeClass("ui-resizable-autohide"),a._handles.show())}).mouseleave(function(){r.disabled||a.resizing||(t(this).addClass("ui-resizable-autohide"),a._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(i){var s,n,o,a=this.options,r=this.element.position(),h=this.element;return this.resizing=!0,/absolute/.test(h.css("position"))?h.css({position:"absolute",top:h.css("top"),left:h.css("left")}):h.is(".ui-draggable")&&h.css({position:"absolute",top:r.top,left:r.left}),this._renderProxy(),s=e(this.helper.css("left")),n=e(this.helper.css("top")),a.containment&&(s+=t(a.containment).scrollLeft()||0,n+=t(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:s,top:n},this.size=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalSize=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalPosition={left:s,top:n},this.sizeDiff={width:h.outerWidth()-h.width(),height:h.outerHeight()-h.height()},this.originalMousePosition={left:i.pageX,top:i.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,o=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===o?this.axis+"-resize":o),h.addClass("ui-resizable-resizing"),this._propagate("start",i),!0},_mouseDrag:function(e){var i,s=this.helper,n={},o=this.originalMousePosition,a=this.axis,r=this.position.top,h=this.position.left,l=this.size.width,c=this.size.height,u=e.pageX-o.left||0,d=e.pageY-o.top||0,p=this._change[a];return p?(i=p.apply(this,[e,u,d]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),this.position.top!==r&&(n.top=this.position.top+"px"),this.position.left!==h&&(n.left=this.position.left+"px"),this.size.width!==l&&(n.width=this.size.width+"px"),this.size.height!==c&&(n.height=this.size.height+"px"),s.css(n),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(n)||this._trigger("resize",e,this.ui()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&t.ui.hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null,h=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(t){var e,s,n,o,a,r=this.options;a={minWidth:i(r.minWidth)?r.minWidth:0,maxWidth:i(r.maxWidth)?r.maxWidth:1/0,minHeight:i(r.minHeight)?r.minHeight:0,maxHeight:i(r.maxHeight)?r.maxHeight:1/0},(this._aspectRatio||t)&&(e=a.minHeight*this.aspectRatio,n=a.minWidth/this.aspectRatio,s=a.maxHeight*this.aspectRatio,o=a.maxWidth/this.aspectRatio,e>a.minWidth&&(a.minWidth=e),n>a.minHeight&&(a.minHeight=n),a.maxWidth>s&&(a.maxWidth=s),a.maxHeight>o&&(a.maxHeight=o)),this._vBoundaries=a},_updateCache:function(t){this.offset=this.helper.offset(),i(t.left)&&(this.position.left=t.left),i(t.top)&&(this.position.top=t.top),i(t.height)&&(this.size.height=t.height),i(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,s=this.size,n=this.axis;return i(t.height)?t.width=t.height*this.aspectRatio:i(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===n&&(t.left=e.left+(s.width-t.width),t.top=null),"nw"===n&&(t.top=e.top+(s.height-t.height),t.left=e.left+(s.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,s=this.axis,n=i(t.width)&&e.maxWidth&&e.maxWidth<t.width,o=i(t.height)&&e.maxHeight&&e.maxHeight<t.height,a=i(t.width)&&e.minWidth&&e.minWidth>t.width,r=i(t.height)&&e.minHeight&&e.minHeight>t.height,h=this.originalPosition.left+this.originalSize.width,l=this.position.top+this.size.height,c=/sw|nw|w/.test(s),u=/nw|ne|n/.test(s);return a&&(t.width=e.minWidth),r&&(t.height=e.minHeight),n&&(t.width=e.maxWidth),o&&(t.height=e.maxHeight),a&&c&&(t.left=h-e.minWidth),n&&c&&(t.left=h-e.maxWidth),r&&u&&(t.top=l-e.minHeight),o&&u&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_proportionallyResize:function(){if(this._proportionallyResizeElements.length){var t,e,i,s,n,o=this.helper||this.element;for(t=0;this._proportionallyResizeElements.length>t;t++){if(n=this._proportionallyResizeElements[t],!this.borderDif)for(this.borderDif=[],i=[n.css("borderTopWidth"),n.css("borderRightWidth"),n.css("borderBottomWidth"),n.css("borderLeftWidth")],s=[n.css("paddingTop"),n.css("paddingRight"),n.css("paddingBottom"),n.css("paddingLeft")],e=0;i.length>e;e++)this.borderDif[e]=(parseInt(i[e],10)||0)+(parseInt(s[e],10)||0);n.css({height:o.height()-this.borderDif[0]-this.borderDif[2]||0,width:o.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).data("ui-resizable"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&t.ui.hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,c=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var i,s,n,o,a,r,h,l=t(this).data("ui-resizable"),c=l.options,u=l.element,d=c.containment,p=d instanceof t?d.get(0):/parent/.test(d)?u.parent().get(0):d;p&&(l.containerElement=t(p),/document/.test(d)||d===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(i=t(p),s=[],t(["Top","Right","Left","Bottom"]).each(function(t,n){s[t]=e(i.css("padding"+n))}),l.containerOffset=i.offset(),l.containerPosition=i.position(),l.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},n=l.containerOffset,o=l.containerSize.height,a=l.containerSize.width,r=t.ui.hasScroll(p,"left")?p.scrollWidth:a,h=t.ui.hasScroll(p)?p.scrollHeight:o,l.parentData={element:p,left:n.left,top:n.top,width:r,height:h}))},resize:function(e){var i,s,n,o,a=t(this).data("ui-resizable"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio),a.position.top=a._helper?h.top:0),a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top,i=Math.abs((a._helper?a.offset.left-u.left:a.offset.left-u.left)+a.sizeDiff.width),s=Math.abs((a._helper?a.offset.top-u.top:a.offset.top-h.top)+a.sizeDiff.height),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o&&(i-=a.parentData.left),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio))},stop:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).data("ui-resizable"),i=e.options,s=function(e){t(e).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseInt(e.width(),10),height:parseInt(e.height(),10),left:parseInt(e.css("left"),10),top:parseInt(e.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):t.each(i.alsoResize,function(t){s(t)})},resize:function(e,i){var s=t(this).data("ui-resizable"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0},h=function(e,s){t(e).each(function(){var e=t(this),n=t(this).data("ui-resizable-alsoresize"),o={},a=s&&s.length?s:e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(a,function(t,e){var i=(n[e]||0)+(r[e]||0);i&&i>=0&&(o[e]=i||null)}),e.css(o)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):t.each(n.alsoResize,function(t,e){h(t,e)})},stop:function(){t(this).removeData("resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).data("ui-resizable");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).data("ui-resizable");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,a=e.axis,r="number"==typeof i.grid?[i.grid,i.grid]:i.grid,h=r[0]||1,l=r[1]||1,c=Math.round((s.width-n.width)/h)*h,u=Math.round((s.height-n.height)/l)*l,d=n.width+c,p=n.height+u,f=i.maxWidth&&d>i.maxWidth,g=i.maxHeight&&p>i.maxHeight,m=i.minWidth&&i.minWidth>d,v=i.minHeight&&i.minHeight>p;i.grid=r,m&&(d+=h),v&&(p+=l),f&&(d-=h),g&&(p-=l),/^(se|s|e)$/.test(a)?(e.size.width=d,e.size.height=p):/^(ne)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.top=o.top-u):/^(sw)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.left=o.left-c):(e.size.width=d,e.size.height=p,e.position.top=o.top-u,e.position.left=o.left-c)}})}(jQuery),function(t){t.widget("ui.selectable",t.ui.mouse,{version:"1.10.3",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e=t(i.options.filter,i.element[0]),e.addClass("ui-selectee"),e.each(function(){var e=t(this),i=e.offset();t.data(this,"selectable-item",{element:this,$element:e,left:i.left,top:i.top,right:i.left+e.outerWidth(),bottom:i.top+e.outerHeight(),startselected:!1,selected:e.hasClass("ui-selected"),selecting:e.hasClass("ui-selecting"),unselecting:e.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=e.addClass("ui-selectee"),this._mouseInit(),this.helper=t("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):undefined}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,h=e.pageY;return o>r&&(i=r,r=o,o=i),a>h&&(i=h,h=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:h-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||o>i.right||i.top>h||a>i.bottom):"fit"===n.tolerance&&(l=i.left>o&&r>i.right&&i.top>a&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}})}(jQuery),function(t){function e(t,e,i){return t>e&&e+i>t}function i(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))}t.widget("ui.sortable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_create:function(){var t=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===t.axis||i(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_setOption:function(e,i){"disabled"===e?(this.options[e]=i,this.widget().toggleClass("ui-sortable-disabled",!!i)):t.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):undefined}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("<style>*{ cursor: "+a.cursor+" !important; }</style>").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<a.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+a.scrollSpeed:e.pageY-this.overflowOffset.top<a.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-a.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<a.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+a.scrollSpeed:e.pageX-this.overflowOffset.left<a.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-a.scrollSpeed)):(e.pageY-t(document).scrollTop()<a.scrollSensitivity?r=t(document).scrollTop(t(document).scrollTop()-a.scrollSpeed):t(window).height()-(e.pageY-t(document).scrollTop())<a.scrollSensitivity&&(r=t(document).scrollTop(t(document).scrollTop()+a.scrollSpeed)),e.pageX-t(document).scrollLeft()<a.scrollSensitivity?r=t(document).scrollLeft(t(document).scrollLeft()-a.scrollSpeed):t(window).width()-(e.pageX-t(document).scrollLeft())<a.scrollSensitivity&&(r=t(document).scrollLeft(t(document).scrollLeft()+a.scrollSpeed))),r!==!1&&t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;</span>&nbsp; <span class='diff-add'>this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var i="x"===this.options.axis||e(this.positionAbs.top+this.offset.click.top,t.top,t.height),s="y"===this.options.axis||e(this.positionAbs.left+this.offset.click.left,t.left,t.width),n=i&&s,o=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return n?this.floating?a&&"right"===a||"down"===o?2:1:o&&("down"===o?2:1):!1},_intersectsWithSides:function(t){var i=e(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),s=e(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),n=this._getDragVerticalDirection(),o=this._getDragHorizontalDirection();return this.floating&&o?"right"===o&&s||"left"===o&&!s:n&&("down"===n&&i||"up"===n&&!i)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){var i,s,n,o,a=[],r=[],h=this._connectWith();if(h&&e)for(i=h.length-1;i>=0;i--)for(n=t(h[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&r.push([t.isFunction(o.options.items)?o.options.items.call(o.element):t(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(r.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),i=r.length-1;i>=0;i--)r[i][0].each(function(){a.push(this)});return t(a)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]).addClass(i||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?e.currentItem.children().each(function(){t("<td>&#160;</td>",e.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_contactContainers:function(s){var n,o,a,r,h,l,c,u,d,p,f=null,g=null;for(n=this.containers.length-1;n>=0;n--)if(!t.contains(this.currentItem[0],this.containers[n].element[0]))if(this._intersectsWith(this.containers[n].containerCache)){if(f&&t.contains(this.containers[n].element[0],f.element[0]))continue;f=this.containers[n],g=n}else this.containers[n].containerCache.over&&(this.containers[n]._trigger("out",s,this._uiHash(this)),this.containers[n].containerCache.over=0);if(f)if(1===this.containers.length)this.containers[g].containerCache.over||(this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1);else{for(a=1e4,r=null,p=f.floating||i(this.currentItem),h=p?"left":"top",l=p?"width":"height",c=this.positionAbs[h]+this.offset.click[h],o=this.items.length-1;o>=0;o--)t.contains(this.containers[g].element[0],this.items[o].item[0])&&this.items[o].item[0]!==this.currentItem[0]&&(!p||e(this.positionAbs.top+this.offset.click.top,this.items[o].top,this.items[o].height))&&(u=this.items[o].item.offset()[h],d=!1,Math.abs(u-c)>Math.abs(u+this.items[o][l]-c)&&(d=!0,u+=this.items[o][l]),a>Math.abs(u-c)&&(a=Math.abs(u-c),r=this.items[o],this.direction=d?"up":"down"));if(!r&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[g])return;r?this._rearrange(s,r,null,!0):this._rearrange(s,null,this.containers[g].element,!0),this._trigger("change",s,this._uiHash()),this.containers[g]._trigger("change",s,this._uiHash(this)),this.currentContainer=this.containers[g],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,t("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(t("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.left<this.containment[0]&&(o=this.containment[0]+this.offset.click.left),e.pageY-this.offset.click.top<this.containment[1]&&(a=this.containment[1]+this.offset.click.top),e.pageX-this.offset.click.left>this.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){this.reverting=!1;var i,s=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(i in this._storedCSS)("auto"===this._storedCSS[i]||"static"===this._storedCSS[i])&&(this._storedCSS[i]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&s.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||s.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(s.push(function(t){this._trigger("remove",t,this._uiHash())}),s.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),s.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),i=this.containers.length-1;i>=0;i--)e||s.push(function(t){return function(e){t._trigger("deactivate",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over&&(s.push(function(t){return function(e){t._trigger("out",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!e){for(this._trigger("beforeStop",t,this._uiHash()),i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!1}if(e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!e){for(i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})}(jQuery),function(t,e){var i="ui-effects-";t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("<p>")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function i(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function s(e,i){var s,n,a={};for(s in i)n=i[s],e[s]!==n&&(o[s]||(t.fx.step[s]||!isNaN(parseFloat(n)))&&(a[s]=n));return a}var n=["add","remove","toggle"],o={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(jQuery.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(e,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var e=t(this);return{el:e,start:i(this)}}),o=function(){t.each(n,function(t,i){e[i]&&a[i+"Class"](e[i])})},o(),l=l.map(function(){return this.end=i(this.el[0]),this.diff=s(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(i){return function(s,n,o,a,r){return"boolean"==typeof n||n===e?o?t.effects.animateClass.call(this,n?{add:s}:{remove:s},o,a,r):i.apply(this,arguments):t.effects.animateClass.call(this,{toggle:s},n,o,a)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function s(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function n(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}t.extend(t.effects,{version:"1.10.3",save:function(t,e){for(var s=0;e.length>s;s++)null!==e[s]&&t.data(i+e[s],t[0].style[e[s]])},restore:function(t,s){var n,o;for(o=0;s.length>o;o++)null!==s[o]&&(n=t.data(i+s[o]),n===e&&(n=""),t.css(s[o],n))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).focus(),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).focus()),e},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function e(e){function s(){t.isFunction(o)&&o.call(n[0]),t.isFunction(e)&&e()}var n=t(this),o=i.complete,r=i.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),s()):a.call(n[0],i,s)}var i=s.apply(this,arguments),n=i.mode,o=i.queue,a=t.effects.effect[i.effect];return t.fx.off||!a?n?this[n](i.duration,i.complete):this.each(function(){i.complete&&i.complete.call(this)}):o===!1?this.each(e):this.queue(o||"fx",e)},show:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="show",this.effect.call(this,i)}}(t.fn.show),hide:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="hide",this.effect.call(this,i)}}(t.fn.hide),toggle:function(t){return function(e){if(n(e)||"boolean"==typeof e)return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="toggle",this.effect.call(this,i)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s}})}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}()}(jQuery),function(t){var e=0,i={},s={};i.height=i.paddingTop=i.paddingBottom=i.borderTopWidth=i.borderBottomWidth="hide",s.height=s.paddingTop=s.paddingBottom=s.borderTopWidth=s.borderBottomWidth="show",t.widget("ui.accordion",{version:"1.10.3",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t(),content:this.active.length?this.active.next():t()}},_createIcons:function(){var e=this.options.icons;e&&(t("<span>").addClass("ui-accordion-header-icon ui-icon "+e.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(e.header).addClass(e.activeHeader),this.headers.addClass("ui-accordion-icons"))</span>&nbsp; <span class='diff-add'>},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),undefined):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),"disabled"===t&&this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!e),undefined)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),o.focus(),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().focus()},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var i,s=this.options,n=s.heightStyle,o=this.element.parent(),a=this.accordionId="ui-accordion-"+(this.element.attr("id")||++e);this.active=this._findActive(s.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(e){var i=t(this),s=i.attr("id"),n=i.next(),o=n.attr("id");s||(s=a+"-header-"+e,i.attr("id",s)),o||(o=a+"-panel-"+e,n.attr("id",o)),i.attr("aria-controls",o),n.attr("aria-labelledby",s)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false",tabIndex:-1}).next().attr({"aria-expanded":"false","aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true",tabIndex:0}).next().attr({"aria-expanded":"true","aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(s.event),"fill"===n?(i=o.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.headers.each(function(){i-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===n&&(i=0,this.headers.next().each(function(){i=Math.max(i,t(this).css("height","").height())}).height(i))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n[0]===s[0],a=o&&i.collapsible,r=a?t():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:a?t():n,newPanel:r};e.preventDefault(),o&&!i.collapsible||this._trigger("beforeActivate",e,l)===!1||(i.active=a?!1:this.headers.index(n),this.active=o?t():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),o||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-expanded":"false","aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr("tabIndex",-1):i.length&&this.headers.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr({"aria-expanded":"true","aria-hidden":"false"}).prev().attr({"aria-selected":"true",tabIndex:0})},_animate:function(t,e,n){var o,a,r,h=this,l=0,c=t.length&&(!e.length||t.index()<e.index()),u=this.options.animate||{},d=c&&u.down||u,p=function(){h._toggleComplete(n)};return"number"==typeof d&&(r=d),"string"==typeof d&&(a=d),a=a||d.easing||u.easing,r=r||d.duration||u.duration,e.length?t.length?(o=t.show().outerHeight(),e.animate(i,{duration:r,easing:a,step:function(t,e){e.now=Math.round(t)}}),t.hide().animate(s,{duration:r,easing:a,complete:p,step:function(t,i){i.now=Math.round(t),"height"!==i.prop?l+=i.now:"content"!==h.options.heightStyle&&(i.now=Math.round(o-e.outerHeight()-l),l=0)}}),undefined):e.animate(i,r,a,p):t.animate(s,r,a,p)},_toggleComplete:function(t){var e=t.oldPanel;e.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger("activate",null,t)}})}(jQuery),function(t){var e=0;t.widget("ui.autocomplete",{version:"1.10.3",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o?!0:a?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,undefined;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:case o.NUMPAD_ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),undefined;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),undefined):(this._searchTimeout(t),undefined)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,undefined):(clearTimeout(this.searching),this.close(t),this._change(t),undefined)}}),this._initSource(),this.menu=t("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().data("ui-menu"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];t(e.target).closest(".ui-menu-item").length||this._delay(function(){var e=this;this.document.one("mousedown",function(s){s.target===e.element[0]||s.target===i||t.contains(i,s.target)||e.close()})})},menufocus:function(e,i){if(this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type)))return this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),undefined;var s=i.item.data("ui-autocomplete-item");!1!==this._trigger("focus",e,{item:s})?e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(s.value):this.liveRegion.text(s.value)},menuselect:function(t,e){var i=e.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",t,{item:i})&&this._value(i.value),this.term=this._value(),this.close(t),this.selectedItem=i}}),this.liveRegion=t("<span>",{role:"status","aria-live":"polite"}).addClass("ui-helper-hidden-accessible").insertBefore(this.element),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e||(e=this.element.closest(".ui-front")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):this._trigger("search",e)!==!1?this._search(t):undefined},_search:function(t){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var t=this,i=++e;return function(s){i===e&&t.__response(s),t.pending--,t.pending||t.element.removeClass("ui-autocomplete-loading")}},__response:function(t){t&&(t=this._normalize(t)),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(e){return e.length&&e[0].label&&e[0].value?e:t.map(e,function(e){return"string"==typeof e?{label:e,value:e}:t.extend({label:e.label||e.value,value:e.value||e.label},e)})},_suggest:function(e){var i=this.menu.element.empty();this._renderMenu(i,e),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(t.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(e,i){var s=this;t.each(i,function(t,i){s._renderItemData(e,i)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(e,i){return t("<li>").append(t("<a>").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this._value(this.term),this.menu.blur(),undefined):(this.menu[t](e),undefined):(this.search(null,e),undefined)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var e;this._superApply(arguments),this.options.disabled||this.cancelSearch||(e=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.text(e))}})}(jQuery),function(t){var e,i,s,n,o="ui-button ui-widget ui-state-default ui-corner-all",a="ui-state-hover ui-state-active ",r="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",h=function(){var e=t(this);setTimeout(function(){e.find(":ui-button").button("refresh")},1)},l=function(e){var i=e.name,s=e.form,n=t([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?t(s).find("[name='"+i+"']"):t("[name='"+i+"']",e.ownerDocument).filter(function(){return!this.form})),n};t.widget("ui.button",{version:"1.10.3",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,h),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var a=this,r=this.options,c="checkbox"===this.type||"radio"===this.type,u=c?"":"ui-state-active",d="ui-state-focus";null===r.label&&(r.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(o).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){r.disabled||this===e&&t(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){r.disabled||t(this).removeClass(u)}).bind("click"+this.eventNamespace,function(t){r.disabled&&(t.preventDefault(),t.stopImmediatePropagation())}),this.element.bind("focus"+this.eventNamespace,function(){a.buttonElement.addClass(d)}).bind("blur"+this.eventNamespace,function(){a.buttonElement.removeClass(d)}),c&&(this.element.bind("change"+this.eventNamespace,function(){n||a.refresh()}),this.buttonElement.bind("mousedown"+this.eventNamespace,function(t){r.disabled||(n=!1,i=t.pageX,s=t.pageY)}).bind("mouseup"+this.eventNamespace,function(t){r.disabled||(i!==t.pageX||s!==t.pageY)&&(n=!0)})),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return r.disabled||n?!1:undefined}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(r.disabled||n)return!1;t(this).addClass("ui-state-active"),a.buttonElement.attr("aria-pressed","true");var e=a.element[0];l(e).not(e).map(function(){return t(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return r.disabled?!1:(t(this).addClass("ui-state-active"),e=this,a.document.one("mouseup",function(){e=null}),undefined)}).bind("mouseup"+this.eventNamespace,function(){return r.disabled?!1:(t(this).removeClass("ui-state-active"),undefined)}).bind("keydown"+this.eventNamespace,function(e){return r.disabled?!1:((e.keyCode===t.ui.keyCode.SPACE||e.keyCode===t.ui.keyCode.ENTER)&&t(this).addClass("ui-state-active"),undefined)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){t(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===t.ui.keyCode.SPACE&&t(this).click()})),this._setOption("disabled",r.disabled),this._resetButton()},_determineButtonType:function(){var t,e,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(t=this.element.parents().last(),e="label[for='"+this.element.attr("id")+"']",this.buttonElement=t.find(e),this.buttonElement.length||(t=t.length?t.siblings():this.element.siblings(),this.buttonElement=t.filter(e),this.buttonElement.length||(this.buttonElement=t.find(e))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(o+" "+a+" "+r).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(t,e){return this._super(t,e),"disabled"===t?(e?this.element.prop("disabled",!0):this.element.prop("disabled",!1),undefined):(this._resetButton(),undefined)},refresh:function(){var e=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");e!==this.options.disabled&&this._setOption("disabled",e),"radio"===this.type?l(this.element[0]).each(function(){t(this).is(":checked")?t(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):t(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),undefined;var e=this.buttonElement.removeClass(r),i=t("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(e.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,o=[];s.primary||s.secondary?(this.options.text&&o.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&e.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&e.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(o.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||e.attr("title",t.trim(i)))):o.push("ui-button-text-only"),e.addClass(o.join(" "))}}),t.widget("ui.buttonset",{version:"1.10.3",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(t,e){"disabled"===t&&this.buttons.button("option",t,e),this._super(t,e)},refresh:function(){var e="rtl"===this.element.css("direction");this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return t(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(e?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(e?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return t(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}})}(jQuery),function(t,e){function i(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.dpDiv=s(t("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function s(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.delegate(i,"mouseout",function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",function(){t.datepicker._isDisabledDatepicker(o.inline?e.parent()[0]:o.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))})}function n(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}t.extend(t.ui,{datepicker:{version:"1.10.3"}});var o,a="datepicker";t.extend(i.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return n(this._defaults,t||{}),this},_attachDatepicker:function(e,i){var s,n,o;s=e.nodeName.toLowerCase(),n="div"===s||"span"===s,e.id||(this.uuid+=1,e.id="dp"+this.uuid),o=this._newInst(t(e),n),o.settings=t.extend({},i||{}),"input"===s?this._connectDatepicker(e,o):n&&this._inlineDatepicker(e,o)},_newInst:function(e,i){var n=e[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:n,input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?s(t("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(e,i){var s=t(e);i.append=t([]),i.trigger=t([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),t.data(e,a,i),i.settings.disabled&&this._disableDatepicker(e))},_attachments:function(e,i){var s,n,o,a=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),a&&(i.append=t("<span class='"+this._appendClass+"'>"+a+"</span>"),e[r?"before":"after"](i.append)),e.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&e.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),o=this._get(i,"buttonImage"),i.trigger=t(this._get(i,"buttonImageOnly")?t("<img/>").addClass(this._triggerClass).attr({src:o,alt:n,title:n}):t("<button type='button'></button>").addClass(this._triggerClass).html(o?t("<img/>").attr({src:o,alt:n,title:n}):n)),e[r?"before":"after"](i.trigger),i.trigger.click(function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,s,n,o=new Date(2009,11,20),a=this._get(t,"dateFormat");a.match(/[DM]/)&&(e=function(t){for(i=0,s=0,n=0;t.length>n;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length)}},_inlineDatepicker:function(e,i){var s=t(e);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),t.data(e,a,i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,s,o,r){var h,l,c,u,d,p=this._dialogInst;return p||(this.uuid+=1,h="dp"+this.uuid,this._dialogInput=t("<input type='text' id='"+h+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),t("body").append(this._dialogInput),p=this._dialogInst=this._newInst(this._dialogInput,!1),p.settings={},t.data(this._dialogInput[0],a,p)),n(p.settings,o||{}),i=i&&i.constructor===Date?this._formatDate(p,i):i,this._dialogInput.val(i),this._pos=r?r.length?r:[r.pageX,r.pageY]:null,this._pos||(l=document.documentElement.clientWidth,c=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[l/2-100+u,c/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),p.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],a,p),this},_destroyDatepicker:function(e){var i,s=t(e),n=t.data(e,a);s.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,a),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty())},_enableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,a);n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,a);n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,a)}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(i,s,o){var a,r,h,l,c=this._getInst(i);return 2===arguments.length&&"string"==typeof s?"defaults"===s?t.extend({},t.datepicker._defaults):c?"all"===s?t.extend({},c.settings):this._get(c,s):null:(a=s||{},"string"==typeof s&&(a={},a[s]=o),c&&(this._curInst===c&&this._hideDatepicker(),r=this._getDateDatepicker(i,!0),h=this._getMinMaxDate(c,"min"),l=this._getMinMaxDate(c,"max"),n(c.settings,a),null!==h&&a.dateFormat!==e&&a.minDate===e&&(c.settings.minDate=this._formatDate(c,h)),null!==l&&a.dateFormat!==e&&a.maxDate===e&&(c.settings.maxDate=this._formatDate(c,l)),"disabled"in a&&(a.disabled?this._disableDatepicker(i):this._enableDatepicker(i)),this._attachments(t(i),c),this._autoSize(c),this._setDate(c,r),this._updateAlternate(c),this._updateDatepicker(c)),e)},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,s,n,o=t.datepicker._getInst(e.target),a=!0,r=o.dpDiv.is(".ui-datepicker-rtl");if(o._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),a=!1;break;case 13:return n=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",o.dpDiv),n[0]&&t.datepicker._selectDay(e.target,o.selectedMonth,o.selectedYear,n[0]),i=t.datepicker._get(o,"onSelect"),i?(s=t.datepicker._formatDate(o),i.apply(o.input?o.input[0]:null,[s,o])):t.datepicker._hideDatepicker(),!1;</span>&nbsp; <span class='diff-add'>case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),a=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),a=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?1:-1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),a=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?-1:1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),a=e.ctrlKey||e.metaKey;break;default:a=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):a=!1;a&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(i){var s,n,o=t.datepicker._getInst(i.target);return t.datepicker._get(o,"constrainInput")?(s=t.datepicker._possibleChars(t.datepicker._get(o,"dateFormat")),n=String.fromCharCode(null==i.charCode?i.keyCode:i.charCode),i.ctrlKey||i.metaKey||" ">n||!s||s.indexOf(n)>-1):e},_doKeyUp:function(e){var i,s=t.datepicker._getInst(e.target);if(s.input.val()!==s.lastVal)try{i=t.datepicker.parseDate(t.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,t.datepicker._getFormatConfig(s)),i&&(t.datepicker._setDateFromField(s),t.datepicker._updateAlternate(s),t.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(e){if(e=e.target||e,"input"!==e.nodeName.toLowerCase()&&(e=t("input",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var i,s,o,a,r,h,l;i=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==i&&(t.datepicker._curInst.dpDiv.stop(!0,!0),i&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),s=t.datepicker._get(i,"beforeShow"),o=s?s.apply(e,[e,i]):{},o!==!1&&(n(i.settings,o),i.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(i),t.datepicker._inDialog&&(e.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),a=!1,t(e).parents().each(function(){return a|="fixed"===t(this).css("position"),!a}),r={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(i),r=t.datepicker._checkOffset(i,r,a),i.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":a?"fixed":"absolute",display:"none",left:r.left+"px",top:r.top+"px"}),i.inline||(h=t.datepicker._get(i,"showAnim"),l=t.datepicker._get(i,"duration"),i.dpDiv.zIndex(t(e).zIndex()+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[h]?i.dpDiv.show(h,t.datepicker._get(i,"showOptions"),l):i.dpDiv[h||"show"](h?l:null),t.datepicker._shouldFocusInput(i)&&i.input.focus(),t.datepicker._curInst=i))}},_updateDatepicker:function(e){this.maxRows=4,o=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e),e.dpDiv.find("."+this._dayOverClass+" a").mouseover();var i,s=this._getNumberOfMonths(e),n=s[1],a=17;e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&e.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),e.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.focus(),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,s){var n=e.dpDiv.outerWidth(),o=e.dpDiv.outerHeight(),a=e.input?e.input.outerWidth():0,r=e.input?e.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?n-a:0,i.left-=s&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=s&&i.top===e.input.offset().top+r?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+o>l&&l>o?Math.abs(o+r):0),i},_findPos:function(e){for(var i,s=this._getInst(e),n=this._get(s,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[n?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,s,n,o,r=this._curInst;!r||e&&r!==t.data(e,a)||this._datepickerShowing&&(i=this._get(r,"showAnim"),s=this._get(r,"duration"),n=function(){t.datepicker._tidyDialog(r)},t.effects&&(t.effects.effect[i]||t.effects[i])?r.dpDiv.hide(i,t.datepicker._get(r,"showOptions"),s,n):r.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,o=this._get(r,"onClose"),o&&o.apply(r.input?r.input[0]:null,[r.input?r.input.val():"",r]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),s=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==s)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,s){var n=t(e),o=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(o,i+("M"===s?this._get(o,"showCurrentAtPos"):0),s),this._updateDatepicker(o))},_gotoToday:function(e){var i,s=t(e),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(e,i,s){var n=t(e),o=this._getInst(n[0]);o["selected"+("M"===s?"Month":"Year")]=o["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(o),this._adjustDate(n)},_selectDay:function(e,i,s,n){var o,a=t(e);t(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(a[0])||(o=this._getInst(a[0]),o.selectedDay=o.currentDay=t("a",n).html(),o.selectedMonth=o.currentMonth=i,o.selectedYear=o.currentYear=s,this._selectDate(e,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var s,n=t(e),o=this._getInst(n[0]);i=null!=i?i:this._formatDate(o),o.input&&o.input.val(i),this._updateAlternate(o),s=this._get(o,"onSelect"),s?s.apply(o.input?o.input[0]:null,[i,o]):o.input&&o.input.trigger("change"),o.inline?this._updateDatepicker(o):(this._hideDatepicker(),this._lastInput=o.input[0],"object"!=typeof o.input[0]&&o.input.focus(),this._lastInput=null)},_updateAlternate:function(e){var i,s,n,o=this._get(e,"altField");o&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),s=this._getDate(e),n=this.formatDate(i,s,this._getFormatConfig(e)),t(o).each(function(){t(this).val(n)}))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(i,s,n){if(null==i||null==s)throw"Invalid arguments";if(s="object"==typeof s?""+s:s+"",""===s)return null;var o,a,r,h,l=0,c=(n?n.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof c?c:(new Date).getFullYear()%100+parseInt(c,10),d=(n?n.dayNamesShort:null)||this._defaults.dayNamesShort,p=(n?n.dayNames:null)||this._defaults.dayNames,f=(n?n.monthNamesShort:null)||this._defaults.monthNamesShort,g=(n?n.monthNames:null)||this._defaults.monthNames,m=-1,v=-1,_=-1,b=-1,y=!1,w=function(t){var e=i.length>o+1&&i.charAt(o+1)===t;return e&&o++,e},k=function(t){var e=w(t),i="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,n=RegExp("^\\d{1,"+i+"}"),o=s.substring(l).match(n);if(!o)throw"Missing number at position "+l;return l+=o[0].length,parseInt(o[0],10)},x=function(i,n,o){var a=-1,r=t.map(w(i)?o:n,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(r,function(t,i){var n=i[1];return s.substr(l,n.length).toLowerCase()===n.toLowerCase()?(a=i[0],l+=n.length,!1):e}),-1!==a)return a+1;throw"Unknown name at position "+l},D=function(){if(s.charAt(l)!==i.charAt(o))throw"Unexpected literal at position "+l;l++};for(o=0;i.length>o;o++)if(y)"'"!==i.charAt(o)||w("'")?D():y=!1;else switch(i.charAt(o)){case"d":_=k("d");break;case"D":x("D",d,p);break;case"o":b=k("o");break;case"m":v=k("m");break;case"M":v=x("M",f,g);break;case"y":m=k("y");break;case"@":h=new Date(k("@")),m=h.getFullYear(),v=h.getMonth()+1,_=h.getDate();break;case"!":h=new Date((k("!")-this._ticksTo1970)/1e4),m=h.getFullYear(),v=h.getMonth()+1,_=h.getDate();break;case"'":w("'")?D():y=!0;break;default:D()}if(s.length>l&&(r=s.substr(l),!/^\s+/.test(r)))throw"Extra/unparsed characters found in date: "+r;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),b>-1)for(v=1,_=b;;){if(a=this._getDaysInMonth(m,v-1),a>=_)break;v++,_-=a}if(h=this._daylightSavingAdjust(new Date(m,v-1,_)),h.getFullYear()!==m||h.getMonth()+1!==v||h.getDate()!==_)throw"Invalid date";return h},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,o=(i?i.dayNames:null)||this._defaults.dayNames,a=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},l=function(t,e,i){var s=""+e;if(h(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return h(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||h("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=l("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=l("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=l("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=h("y")?e.getFullYear():(10>e.getYear()%100?"0":"")+e.getYear()%100;break;case"@":u+=e.getTime();break;case"!":u+=1e4*e.getTime()+this._ticksTo1970;break;case"'":h("'")?u+="'":d=!0;break;default:u+=t.charAt(s)}return u},_possibleChars:function(t){var e,i="",s=!1,n=function(i){var s=t.length>e+1&&t.charAt(e+1)===i;return s&&e++,s};for(e=0;t.length>e;e++)if(s)"'"!==t.charAt(e)||n("'")?i+=t.charAt(e):s=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,i){return t.settings[i]!==e?t.settings[i]:this._defaults[i]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(r){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,s){var n=function(t){var e=new Date;return e.setDate(e.getDate()+t),e},o=function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,o=n.getFullYear(),a=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":a+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}l=h.exec(i)}return new Date(o,a,r)},a=null==i||""===i?s:"string"==typeof i?o(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return a=a&&"Invalid Date"==""+a?s:a,a&&(a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)),this._daylightSavingAdjust(a)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,a=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=a.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=a.getMonth(),t.drawYear=t.selectedYear=t.currentYear=a.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){var e=!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return e},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),s="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(s,-i,"M")},next:function(){t.datepicker._adjustDate(s,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(s)},selectDay:function(){return t.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(s,this,"Y"),!1}};t(this).bind(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,h,l,c,u,d,p,f,g,m,v,_,b,y,w,k,x,D,C,I,P,T,M,S,z,A,H,E,N,W,O,F,R,L=new Date,j=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(t,"isRTL"),B=this._get(t,"showButtonPanel"),V=this._get(t,"hideIfNoPrevNext"),K=this._get(t,"navigationAsDateFormat"),U=this._getNumberOfMonths(t),q=this._get(t,"showCurrentAtPos"),Q=this._get(t,"stepMonths"),X=1!==U[0]||1!==U[1],$=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),G=this._getMinMaxDate(t,"min"),J=this._getMinMaxDate(t,"max"),Z=t.drawMonth-q,te=t.drawYear;if(0>Z&&(Z+=12,te--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-U[0]*U[1]+1,J.getDate())),e=G&&G>e?G:e;this._daylightSavingAdjust(new Date(te,Z,1))>e;)Z--,0>Z&&(Z=11,te--);for(t.drawMonth=Z,t.drawYear=te,i=this._get(t,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(te,Z-Q,1)),this._getFormatConfig(t)):i,s=this._canAdjustMonth(t,-1,te,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":V?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+Q,1)),this._getFormatConfig(t)):n,o=this._canAdjustMonth(t,1,te,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":V?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?$:j,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,h=t.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(t,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+a+"</button>":"")+(Y?"":h)+"</div>":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,u=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),v=this._get(t,"showOtherMonths"),_=this._get(t,"selectOtherMonths"),b=this._getDefaultDate(t),y="",k=0;U[0]>k;k++){for(x="",this.maxRows=4,D=0;U[1]>D;D++){if(C=this._daylightSavingAdjust(new Date(te,Z,t.selectedDay)),I=" ui-corner-all",P="",X){if(P+="<div class='ui-datepicker-group",U[1]>1)switch(D){case 0:P+=" ui-datepicker-group-first",I=" ui-corner-"+(Y?"right":"left");break;case U[1]-1:P+=" ui-datepicker-group-last",I=" ui-corner-"+(Y?"left":"right");break;default:P+=" ui-datepicker-group-middle",I=""}P+="'>"}for(P+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+I+"'>"+(/all|left/.test(I)&&0===k?Y?o:s:"")+(/all|right/.test(I)&&0===k?Y?s:o:"")+this._generateMonthYearHeader(t,Z,te,G,J,k>0||D>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",T=u?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)M=(w+c)%7,T+="<th"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+d[M]+"'>"+p[M]+"</span></th>";for(P+=T+"</tr></thead><tbody>",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),z=(this._getFirstDayOfMonth(te,Z)-c+7)%7,A=Math.ceil((z+S)/7),H=X?this.maxRows>A?this.maxRows:A:A,this.maxRows=H,E=this._daylightSavingAdjust(new Date(te,Z,1-z)),N=0;H>N;N++){for(P+="<tr>",W=u?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(E)+"</td>":"",w=0;7>w;w++)O=m?m.apply(t.input?t.input[0]:null,[E]):[!0,""],F=E.getMonth()!==Z,R=F&&!_||!O[0]||G&&G>E||J&&E>J,W+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(E.getTime()===C.getTime()&&Z===t.selectedMonth&&t._keyEvent||b.getTime()===E.getTime()&&b.getTime()===C.getTime()?" "+this._dayOverClass:"")+(R?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!v?"":" "+O[1]+(E.getTime()===$.getTime()?" "+this._currentClass:"")+(E.getTime()===j.getTime()?" ui-datepicker-today":""))+"'"+(F&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"&#39;")+"'")+(R?"":" data-handler='selectDay' data-event='click' data-month='"+E.getMonth()+"' data-year='"+E.getFullYear()+"'")+">"+(F&&!v?"&#xa0;":R?"<span class='ui-state-default'>"+E.getDate()+"</span>":"<a class='ui-state-default"+(E.getTime()===j.getTime()?" ui-state-highlight":"")+(E.getTime()===$.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+"' href='#'>"+E.getDate()+"</a>")+"</td>",E.setDate(E.getDate()+1),E=this._daylightSavingAdjust(E);P+=W+"</tr>"}Z++,Z>11&&(Z=0,te++),P+="</tbody></table>"+(X?"</div>"+(U[0]>0&&D===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),x+=P}y+=x}return y+=l,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var h,l,c,u,d,p,f,g,m=this._get(t,"changeMonth"),v=this._get(t,"changeYear"),_=this._get(t,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",y="";if(o||!m)y+="<span class='ui-datepicker-month'>"+a[e]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!h||c>=s.getMonth())&&(!l||n.getMonth()>=c)&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(_||(b+=y+(!o&&m&&v?"":"&#xa0;")),!t.yearshtml)if(t.yearshtml="",o||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),g=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,g=n?Math.min(g,n.getFullYear()):g,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";g>=f;f++)t.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";t.yearshtml+="</select>",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),_&&(b+=(!o&&m&&v?"":"&#xa0;")+y),b+="</div>"},_adjustInstDate:function(t,e,i){var s=t.drawYear+("Y"===i?e:0),n=t.drawMonth+("M"===i?e:0),o=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),a=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,o)));t.selectedDay=a.getDate(),t.drawMonth=t.selectedMonth=a.getMonth(),t.drawYear=t.selectedYear=a.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),o=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&o.setDate(this._getDaysInMonth(o.getFullYear(),o.getMonth())),this._isInRange(t,o)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),o=this._getMinMaxDate(t,"max"),a=null,r=null,h=this._get(t,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),a=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(a+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||e.getTime()>=n.getTime())&&(!o||e.getTime()<=o.getTime())&&(!a||e.getFullYear()>=a)&&(!r||r>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).mousedown(t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new i,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.10.3"}(jQuery),function(t){var e={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},i={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};t.widget("ui.dialog",{version:"1.10.3",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&this._trigger("beforeClose",e)!==!1&&(this._isOpen=!1,this._destroyOverlay(),this.opener.filter(":focusable").focus().length||t(this.document[0].activeElement).blur(),this._hide(this.uiDialog,this.options.hide,function(){i._trigger("close",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,e){var i=!!this.uiDialog.nextAll(":visible").insertBefore(this.uiDialog).length;return i&&!e&&this._trigger("focus",t),i},open:function(){var e=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),undefined):(this._isOpen=!0,this.opener=t(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._trigger("open"),undefined)},_focusTabbable:function(){var t=this.element.find("[autofocus]");t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).focus()},_keepFocus:function(e){function i(){var e=this.document[0].activeElement,i=this.uiDialog[0]===e||t.contains(this.uiDialog[0],e);i||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),this.close(e),undefined;if(e.keyCode===t.ui.keyCode.TAB){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");e.target!==n[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==s[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(n.focus(1),e.preventDefault()):(s.focus(1),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=t("<button></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(e),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title||t.html("&#160;"),t.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=t("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),undefined):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(e.element[0],arguments)},o={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,t("<button></button>",s).button(o).appendTo(e.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),undefined)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){t(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){s.position=[o.position.left-i.document.scrollLeft(),o.position.top-i.document.scrollTop()],t(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}</span>&nbsp; <span class='diff-add'>}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){t(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){s.height=t(this).height(),s.width=t(this).width(),t(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(s){var n=this,o=!1,a={};t.each(s,function(t,s){n._setOption(t,s),t in e&&(o=!0),t in i&&(a[t]=s)}),o&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",a)},_setOption:function(t,e){var i,s,n=this.uiDialog;"dialogClass"===t&&n.removeClass(this.options.dialogClass).addClass(e),"disabled"!==t&&(this._super(t,e),"appendTo"===t&&this.uiDialog.appendTo(this._appendTo()),"buttons"===t&&this._createButtons(),"closeText"===t&&this.uiDialogTitlebarClose.button({label:""+e}),"draggable"===t&&(i=n.is(":data(ui-draggable)"),i&&!e&&n.draggable("destroy"),!i&&e&&this._makeDraggable()),"position"===t&&this._position(),"resizable"===t&&(s=n.is(":data(ui-resizable)"),s&&!e&&n.resizable("destroy"),s&&"string"==typeof e&&n.resizable("option","handles",e),s||e===!1||this._makeResizable()),"title"===t&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("<div>").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=this,i=this.widgetFullName;t.ui.dialog.overlayInstances||this._delay(function(){t.ui.dialog.overlayInstances&&this.document.bind("focusin.dialog",function(s){e._allowInteraction(s)||(s.preventDefault(),t(".ui-dialog:visible:last .ui-dialog-content").data(i)._focusTabbable())})}),this.overlay=t("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),t.ui.dialog.overlayInstances++}},_destroyOverlay:function(){this.options.modal&&this.overlay&&(t.ui.dialog.overlayInstances--,t.ui.dialog.overlayInstances||this.document.unbind("focusin.dialog"),this.overlay.remove(),this.overlay=null)}}),t.ui.dialog.overlayInstances=0,t.uiBackCompat!==!1&&t.widget("ui.dialog",t.ui.dialog,{_position:function(){var e,i=this.options.position,s=[],n=[0,0];i?(("string"==typeof i||"object"==typeof i&&"0"in i)&&(s=i.split?i.split(" "):[i[0],i[1]],1===s.length&&(s[1]=s[0]),t.each(["left","top"],function(t,e){+s[t]===s[t]&&(n[t]=s[t],s[t]=e)}),i={my:s[0]+(0>n[0]?n[0]:"+"+n[0])+" "+s[1]+(0>n[1]?n[1]:"+"+n[1]),at:s.join(" ")}),i=t.extend({},t.ui.dialog.prototype.options.position,i)):i=t.ui.dialog.prototype.options.position,e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.position(i),e||this.uiDialog.hide()}})}(jQuery),function(t){var e=/up|down|vertical/,i=/up|left|vertical|horizontal/;t.effects.effect.blind=function(s,n){var o,a,r,h=t(this),l=["position","top","bottom","left","right","height","width"],c=t.effects.setMode(h,s.mode||"hide"),u=s.direction||"up",d=e.test(u),p=d?"height":"width",f=d?"top":"left",g=i.test(u),m={},v="show"===c;h.parent().is(".ui-effects-wrapper")?t.effects.save(h.parent(),l):t.effects.save(h,l),h.show(),o=t.effects.createWrapper(h).css({overflow:"hidden"}),a=o[p](),r=parseFloat(o.css(f))||0,m[p]=v?a:0,g||(h.css(d?"bottom":"right",0).css(d?"top":"left","auto").css({position:"absolute"}),m[f]=v?r:a+r),v&&(o.css(p,0),g||o.css(f,r+a)),o.animate(m,{duration:s.duration,easing:s.easing,queue:!1,complete:function(){"hide"===c&&h.hide(),t.effects.restore(h,l),t.effects.removeWrapper(h),n()}})}}(jQuery),function(t){t.effects.effect.bounce=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","height","width"],h=t.effects.setMode(a,e.mode||"effect"),l="hide"===h,c="show"===h,u=e.direction||"up",d=e.distance,p=e.times||5,f=2*p+(c||l?1:0),g=e.duration/f,m=e.easing,v="up"===u||"down"===u?"top":"left",_="up"===u||"left"===u,b=a.queue(),y=b.length;for((c||l)&&r.push("opacity"),t.effects.save(a,r),a.show(),t.effects.createWrapper(a),d||(d=a["top"===v?"outerHeight":"outerWidth"]()/3),c&&(o={opacity:1},o[v]=0,a.css("opacity",0).css(v,_?2*-d:2*d).animate(o,g,m)),l&&(d/=Math.pow(2,p-1)),o={},o[v]=0,s=0;p>s;s++)n={},n[v]=(_?"-=":"+=")+d,a.animate(n,g,m).animate(o,g,m),d=l?2*d:d/2;l&&(n={opacity:0},n[v]=(_?"-=":"+=")+d,a.animate(n,g,m)),a.queue(function(){l&&a.hide(),t.effects.restore(a,r),t.effects.removeWrapper(a),i()}),y>1&&b.splice.apply(b,[1,0].concat(b.splice(y,f+1))),a.dequeue()}}(jQuery),function(t){t.effects.effect.clip=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","height","width"],h=t.effects.setMode(a,e.mode||"hide"),l="show"===h,c=e.direction||"vertical",u="vertical"===c,d=u?"height":"width",p=u?"top":"left",f={};t.effects.save(a,r),a.show(),s=t.effects.createWrapper(a).css({overflow:"hidden"}),n="IMG"===a[0].tagName?s:a,o=n[d](),l&&(n.css(d,0),n.css(p,o/2)),f[d]=l?o:0,f[p]=l?0:o/2,n.animate(f,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){l||a.hide(),t.effects.restore(a,r),t.effects.removeWrapper(a),i()}})}}(jQuery),function(t){t.effects.effect.drop=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","opacity","height","width"],a=t.effects.setMode(n,e.mode||"hide"),r="show"===a,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h?"pos":"neg",u={opacity:r?1:0};t.effects.save(n,o),n.show(),t.effects.createWrapper(n),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===c?-s:s),u[l]=(r?"pos"===c?"+=":"-=":"pos"===c?"-=":"+=")+s,n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}})}}(jQuery),function(t){t.effects.effect.explode=function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),g||p.hide(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=t.effects.setMode(p,e.mode||"hide"),g="show"===f,m=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/d),_=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*_,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*v,l=a-(d-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-a*v,top:-o*_}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:_,left:r+(g?l*v:0),top:h+(g?c*_:0),opacity:g?0:1}).animate({left:r+(g?0:l*v),top:h+(g?0:c*_),opacity:g?1:0},e.duration||500,e.easing,s)}}(jQuery),function(t){t.effects.effect.fade=function(e,i){var s=t(this),n=t.effects.setMode(s,e.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}}(jQuery),function(t){t.effects.effect.fold=function(e,i){var s,n,o=t(this),a=["position","top","bottom","left","right","height","width"],r=t.effects.setMode(o,e.mode||"hide"),h="show"===r,l="hide"===r,c=e.size||15,u=/([0-9]+)%/.exec(c),d=!!e.horizFirst,p=h!==d,f=p?["width","height"]:["height","width"],g=e.duration/2,m={},v={};t.effects.save(o,a),o.show(),s=t.effects.createWrapper(o).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],u&&(c=parseInt(u[1],10)/100*n[l?0:1]),h&&s.css(d?{height:0,width:c}:{height:c,width:0}),m[f[0]]=h?n[0]:c,v[f[1]]=h?n[1]:0,s.animate(m,g,e.easing).animate(v,g,e.easing,function(){l&&o.hide(),t.effects.restore(o,a),t.effects.removeWrapper(o),i()})}}(jQuery),function(t){t.effects.effect.highlight=function(e,i){var s=t(this),n=["backgroundImage","backgroundColor","opacity"],o=t.effects.setMode(s,e.mode||"show"),a={backgroundColor:s.css("backgroundColor")};"hide"===o&&(a.opacity=0),t.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(a,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===o&&s.hide(),t.effects.restore(s,n),i()}})}}(jQuery),function(t){t.effects.effect.pulsate=function(e,i){var s,n=t(this),o=t.effects.setMode(n,e.mode||"show"),a="show"===o,r="hide"===o,h=a||"hide"===o,l=2*(e.times||5)+(h?1:0),c=e.duration/l,u=0,d=n.queue(),p=d.length;for((a||!n.is(":visible"))&&(n.css("opacity",0).show(),u=1),s=1;l>s;s++)n.animate({opacity:u},c,e.easing),u=1-u;n.animate({opacity:u},c,e.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&d.splice.apply(d,[1,0].concat(d.splice(p,l+1))),n.dequeue()}}(jQuery),function(t){t.effects.effect.puff=function(e,i){var s=t(this),n=t.effects.setMode(s,e.mode||"hide"),o="hide"===n,a=parseInt(e.percent,10)||150,r=a/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};t.extend(e,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:o?a:100,from:o?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(e)},t.effects.effect.scale=function(e,i){var s=t(this),n=t.extend(!0,{},e),o=t.effects.setMode(s,e.mode||"effect"),a=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"hide"===o?0:100),r=e.direction||"both",h=e.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},c={y:"horizontal"!==r?a/100:1,x:"vertical"!==r?a/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==o&&(n.origin=h||["middle","center"],n.restore=!0),n.from=e.from||("show"===o?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*c.y,width:l.width*c.x,outerHeight:l.outerHeight*c.y,outerWidth:l.outerWidth*c.x},n.fade&&("show"===o&&(n.from.opacity=0,n.to.opacity=1),"hide"===o&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},t.effects.effect.size=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],c=["fontSize"],u=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],d=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=t.effects.setMode(a,e.mode||"effect"),f=e.restore||"effect"!==p,g=e.scale||"both",m=e.origin||["middle","center"],v=a.css("position"),_=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&a.show(),s={height:a.height(),width:a.width(),outerHeight:a.outerHeight(),outerWidth:a.outerWidth()},"toggle"===e.mode&&"show"===p?(a.from=e.to||b,a.to=e.from||s):(a.from=e.from||("show"===p?b:s),a.to=e.to||("hide"===p?b:s)),o={from:{y:a.from.height/s.height,x:a.from.width/s.width},to:{y:a.to.height/s.height,x:a.to.width/s.width}},("box"===g||"both"===g)&&(o.from.y!==o.to.y&&(_=_.concat(u),a.from=t.effects.setTransition(a,u,o.from.y,a.from),a.to=t.effects.setTransition(a,u,o.to.y,a.to)),o.from.x!==o.to.x&&(_=_.concat(d),a.from=t.effects.setTransition(a,d,o.from.x,a.from),a.to=t.effects.setTransition(a,d,o.to.x,a.to))),("content"===g||"both"===g)&&o.from.y!==o.to.y&&(_=_.concat(c).concat(l),a.from=t.effects.setTransition(a,c,o.from.y,a.from),a.to=t.effects.setTransition(a,c,o.to.y,a.to)),t.effects.save(a,_),a.show(),t.effects.createWrapper(a),a.css("overflow","hidden").css(a.from),m&&(n=t.effects.getBaseline(m,s),a.from.top=(s.outerHeight-a.outerHeight())*n.y,a.from.left=(s.outerWidth-a.outerWidth())*n.x,a.to.top=(s.outerHeight-a.to.outerHeight)*n.y,a.to.left=(s.outerWidth-a.to.outerWidth)*n.x),a.css(a.from),("content"===g||"both"===g)&&(u=u.concat(["marginTop","marginBottom"]).concat(c),d=d.concat(["marginLeft","marginRight"]),l=r.concat(u).concat(d),a.find("*[width]").each(function(){var i=t(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};f&&t.effects.save(i,l),i.from={height:s.height*o.from.y,width:s.width*o.from.x,outerHeight:s.outerHeight*o.from.y,outerWidth:s.outerWidth*o.from.x},i.to={height:s.height*o.to.y,width:s.width*o.to.x,outerHeight:s.height*o.to.y,outerWidth:s.width*o.to.x},o.from.y!==o.to.y&&(i.from=t.effects.setTransition(i,u,o.from.y,i.from),i.to=t.effects.setTransition(i,u,o.to.y,i.to)),o.from.x!==o.to.x&&(i.from=t.effects.setTransition(i,d,o.from.x,i.from),i.to=t.effects.setTransition(i,d,o.to.x,i.to)),i.css(i.from),i.animate(i.to,e.duration,e.easing,function(){f&&t.effects.restore(i,l)})})),a.animate(a.to,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){0===a.to.opacity&&a.css("opacity",a.from.opacity),"hide"===p&&a.hide(),t.effects.restore(a,_),f||("static"===v?a.css({position:"relative",top:a.to.top,left:a.to.left}):t.each(["top","left"],function(t,e){a.css(e,function(e,i){var s=parseInt(i,10),n=t?a.to.left:a.to.top;return"auto"===i?n+"px":s+n+"px"})})),t.effects.removeWrapper(a),i()}})}}(jQuery),function(t){t.effects.effect.shake=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","height","width"],a=t.effects.setMode(n,e.mode||"effect"),r=e.direction||"left",h=e.distance||20,l=e.times||3,c=2*l+1,u=Math.round(e.duration/c),d="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},g={},m={},v=n.queue(),_=v.length;for(t.effects.save(n,o),n.show(),t.effects.createWrapper(n),f[d]=(p?"-=":"+=")+h,g[d]=(p?"+=":"-=")+2*h,m[d]=(p?"-=":"+=")+2*h,n.animate(f,u,e.easing),s=1;l>s;s++)n.animate(g,u,e.easing).animate(m,u,e.easing);n.animate(g,u,e.easing).animate(f,u/2,e.easing).queue(function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}),_>1&&v.splice.apply(v,[1,0].concat(v.splice(_,c+1))),n.dequeue()}}(jQuery),function(t){t.effects.effect.slide=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","width","height"],a=t.effects.setMode(n,e.mode||"show"),r="show"===a,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u={};t.effects.save(n,o),n.show(),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0),t.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,c?isNaN(s)?"-"+s:-s:s),u[l]=(r?c?"+=":"-=":c?"-=":"+=")+s,n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}})}}(jQuery),function(t){t.effects.effect.transfer=function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),i()})}}(jQuery),function(t){t.widget("ui.menu",{version:"1.10.3",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content ui-corner-all").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}).bind("click"+this.eventNamespace,t.proxy(function(t){this.options.disabled&&t.preventDefault()},this)),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item > a":function(t){t.preventDefault()},"click .ui-state-disabled > a":function(t){t.preventDefault()},"click .ui-menu-item:has(a)":function(e){var i=t(e.target).closest(".ui-menu-item");!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.mouseHandled=!0,this.select(e),i.has(".ui-menu").length?this.expand(e):this.element.is(":focus")||(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){var i=t(e.currentTarget);i.siblings().children(".ui-state-active").removeClass("ui-state-active"),this.focus(e,i)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.children(".ui-menu-item").eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){t.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){t(e.target).closest(".ui-menu").length||this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").children("a").removeUniqueId().removeClass("ui-corner-all ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var e=t(this);e.data("ui-menu-submenu-carat")&&e.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(e){function i(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var s,n,o,a,r,h=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:h=!1,n=this.previousFilter||"",o=String.fromCharCode(e.keyCode),a=!1,clearTimeout(this.filterTimer),o===n?a=!0:o=n+o,r=RegExp("^"+i(o),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())}),s=a&&-1!==s.index(this.active.next())?this.active.nextAll(".ui-menu-item"):s,s.length||(o=String.fromCharCode(e.keyCode),r=RegExp("^"+i(o),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())})),s.length?(this.focus(e,s),s.length>1?(this.previousFilter=o,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}h&&e.preventDefault()},_activate:function(t){this.active.is(".ui-state-disabled")||(this.active.children("a[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i=this.options.icons.submenu,s=this.element.find(this.options.menus);s.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-corner-all").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),s=e.prev("a"),n=t("<span>").addClass("ui-menu-icon ui-icon "+i).data("ui-menu-submenu-carat",!0);s.attr("aria-haspopup","true").prepend(n),e.attr("aria-labelledby",s.attr("id"))}),e=s.add(this.element),e.children(":not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","presentation").children("a").uniqueId().addClass("ui-corner-all").attr({tabIndex:-1,role:this._itemRole()}),e.children(":not(.ui-menu-item)").each(function(){var e=t(this);/[^\-\u2014\u2013\s]/.test(e.text())||e.addClass("ui-widget-content ui-menu-divider")}),e.children(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){"icons"===t&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(e.submenu),this._super(t,e)},focus:function(t,e){var i,s;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children("a").addClass("ui-state-focus"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").children("a:first").addClass("ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.height(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this.active.children("a").removeClass("ui-state-focus"),this.active=null,this._trigger("blur",t,{item:this.active}))},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find("a.ui-state-active").removeClass("ui-state-active")},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").children(".ui-menu-item").first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.children(".ui-menu-item")[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item")[this.active?"last":"first"]())),undefined):(this.next(e),undefined)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item").first())),undefined):(this.next(e),undefined)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)}})}(jQuery),function(t,e){function i(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function s(e,i){return parseInt(t.css(e,i),10)||0}function n(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}t.ui=t.ui||{};var o,a=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;t.position={scrollbarWidth:function(){if(o!==e)return o;var i,s,n=t("<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=n.children()[0];return t("body").append(n),i=a.offsetWidth,n.css("overflow","scroll"),s=a.offsetWidth,i===s&&(s=n[0].clientWidth),n.remove(),o=i-s},getScrollInfo:function(e){var i=e.isWindow?"":e.element.css("overflow-x"),s=e.isWindow?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]);return{element:i,isWindow:s,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s?i.width():i.outerWidth(),height:s?i.height():i.outerHeight()}}},t.fn.position=function(e){if(!e||!e.of)return f.apply(this,arguments);e=t.extend({},e);var o,p,g,m,v,_,b=t(e.of),y=t.position.getWithinInfo(e.within),w=t.position.getScrollInfo(y),k=(e.collision||"flip").split(" "),x={};return _=n(b),b[0].preventDefault&&(e.at="left top"),p=_.width,g=_.height,m=_.offset,v=t.extend({},m),t.each(["my","at"],function(){var t,i,s=(e[this]||"").split(" ");1===s.length&&(s=l.test(s[0])?s.concat(["center"]):c.test(s[0])?["center"].concat(s):["center","center"]),s[0]=l.test(s[0])?s[0]:"center",s[1]=c.test(s[1])?s[1]:"center",t=u.exec(s[0]),i=u.exec(s[1]),x[this]=[t?t[0]:0,i?i[0]:0],e[this]=[d.exec(s[0])[0],d.exec(s[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===e.at[0]?v.left+=p:"center"===e.at[0]&&(v.left+=p/2),"bottom"===e.at[1]?v.top+=g:"center"===e.at[1]&&(v.top+=g/2),o=i(x.at,p,g),v.left+=o[0],v.top+=o[1],this.each(function(){var n,l,c=t(this),u=c.outerWidth(),d=c.outerHeight(),f=s(this,"marginLeft"),_=s(this,"marginTop"),D=u+f+s(this,"marginRight")+w.width,C=d+_+s(this,"marginBottom")+w.height,I=t.extend({},v),P=i(x.my,c.outerWidth(),c.outerHeight());"right"===e.my[0]?I.left-=u:"center"===e.my[0]&&(I.left-=u/2),"bottom"===e.my[1]?I.top-=d:"center"===e.my[1]&&(I.top-=d/2),I.left+=P[0],I.top+=P[1],t.support.offsetFractions||(I.left=h(I.left),I.top=h(I.top)),n={marginLeft:f,marginTop:_},t.each(["left","top"],function(i,s){t.ui.position[k[i]]&&t.ui.position[k[i]][s](I,{targetWidth:p,targetHeight:g,elemWidth:u,elemHeight:d,collisionPosition:n,collisionWidth:D,collisionHeight:C,offset:[o[0]+P[0],o[1]+P[1]],my:e.my,at:e.at,within:y,elem:c})}),e.using&&(l=function(t){var i=m.left-I.left,s=i+p-u,n=m.top-I.top,o=n+g-d,h={target:{element:b,left:m.left,top:m.top,width:p,height:g},element:{element:c,left:I.left,top:I.top,width:u,height:d},horizontal:0>s?"left":i>0?"right":"center",vertical:0>o?"top":n>0?"bottom":"middle"};u>p&&p>r(i+s)&&(h.horizontal="center"),d>g&&g>r(n+o)&&(h.vertical="middle"),h.important=a(r(i),r(s))>a(r(n),r(o))?"horizontal":"vertical",e.using.call(this,t,h)}),c.offset(t.extend(I,{using:l}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,o=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-o-n;e.collisionWidth>o?h>0&&0>=l?(i=t.left+h+e.collisionWidth-o-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+o-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=a(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,o=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-o-n;e.collisionHeight>o?h>0&&0>=l?(i=t.top+h+e.collisionHeight-o-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+o-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=a(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,a=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-a-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-a-o,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,a=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-a-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-a-o,t.top+p+f+g>c&&(0>s||r(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,t.top+p+f+g>u&&(i>0||u>r(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}},function(){var e,i,s,n,o,a=document.getElementsByTagName("body")[0],r=document.createElement("div");e=document.createElement(a?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},a&&t.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)e.style[o]=s[o];e.appendChild(r),i=a||document.documentElement,i.insertBefore(e,i.firstChild),r.style.cssText="position: absolute; left: 10.7432222px;",n=t(r).offset().left,t.support.offsetFractions=n>10&&11>n,e.innerHTML="",i.removeChild(e)}()}(jQuery),function(t,e){t.widget("ui.progressbar",{version:"1.10.3",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=t("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()</span>&nbsp; <span class='diff-add'>},value:function(t){return t===e?this.options.value:(this.options.value=this._constrainedValue(t),this._refreshValue(),e)},_constrainedValue:function(t){return t===e&&(t=this.options.value),this.indeterminate=t===!1,"number"!=typeof t&&(t=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).toggleClass("ui-corner-right",e===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}})}(jQuery),function(t){var e=5;t.widget("ui.slider",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),o="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",a=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),e=n.length;i>e;e++)a.push(o);this.handles=n.add(t(a.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e)})},_createRange:function(){var e=this.options,i="";e.range?(e.range===!0&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=t("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===e.range||"max"===e.range?" ui-slider-range-"+e.range:""))):this.range=t([])},_setupEvents:function(){var t=this.handles.add(this.range).filter("a");this._off(t),this._on(t,this._handleEvents),this._hoverable(t),this._focusable(t)},_destroy:function(){this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(e){var i,s,n,o,a,r,h,l,c=this,u=this.options;return u.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(s-c.values(e));(n>i||n===i&&(e===c._lastChangedValue||c.values(e)===u.min))&&(n=i,o=t(this),a=e)}),r=this._start(e,a),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=a,o.addClass("ui-state-active").focus(),h=o.offset(),l=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-h.left-o.width()/2,top:e.pageY-h.top-o.height()/2-(parseInt(o.css("borderTopWidth"),10)||0)-(parseInt(o.css("borderBottomWidth"),10)||0)+(parseInt(o.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,a,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,i,s,n,o;return"horizontal"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/e,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),o=this._valueMin()+s*n,this._trimAlignValue(o)},_start:function(t,e){var i={handle:this.handles[e],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._trigger("start",t,i)},_slide:function(t,e,i){var s,n,o;this.options.values&&this.options.values.length?(s=this.values(e?0:1),2===this.options.values.length&&this.options.range===!0&&(0===e&&i>s||1===e&&s>i)&&(i=s),i!==this.values(e)&&(n=this.values(),n[e]=i,o=this._trigger("slide",t,{handle:this.handles[e],value:i,values:n}),s=this.values(e?0:1),o!==!1&&this.values(e,i,!0))):i!==this.value()&&(o=this._trigger("slide",t,{handle:this.handles[e],value:i}),o!==!1&&this.value(i))},_stop:function(t,e){var i={handle:this.handles[e],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._trigger("stop",t,i)},_change:function(t,e){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[e],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._lastChangedValue=e,this._trigger("change",t,i)}},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),this._change(null,0),undefined):this._value()},values:function(e,i){var s,n,o;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),this._change(null,e),undefined;if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(e):this.value();for(s=this.options.values,n=arguments[0],o=0;s.length>o;o+=1)s[o]=this._trimAlignValue(n[o]),this._change(null,o);this._refreshValue()},_setOption:function(e,i){var s,n=0;switch("range"===e&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(n=this.options.values.length),t.Widget.prototype._setOption.apply(this,arguments),e){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,s;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,s=t-i;return 2*Math.abs(i)>=e&&(s+=i>0?e:-e),parseFloat(s.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var e,i,s,n,o,a=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,c={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),c["horizontal"===h.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[l?"animate":"css"](c,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(s=this.value(),n=this._valueMin(),o=this._valueMax(),i=o!==n?100*((s-n)/(o-n)):0,c["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(i){var s,n,o,a,r=t(i.target).data("ui-slider-handle-index");switch(i.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(i.preventDefault(),!this._keySliding&&(this._keySliding=!0,t(i.target).addClass("ui-state-active"),s=this._start(i,r),s===!1))return}switch(a=this.options.step,n=o=this.options.values&&this.options.values.length?this.values(r):this.value(),i.keyCode){case t.ui.keyCode.HOME:o=this._valueMin();break;case t.ui.keyCode.END:o=this._valueMax();break;case t.ui.keyCode.PAGE_UP:o=this._trimAlignValue(n+(this._valueMax()-this._valueMin())/e);break;case t.ui.keyCode.PAGE_DOWN:o=this._trimAlignValue(n-(this._valueMax()-this._valueMin())/e);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(n===this._valueMax())return;o=this._trimAlignValue(n+a);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(n===this._valueMin())return;o=this._trimAlignValue(n-a)}this._slide(i,r,o)},click:function(t){t.preventDefault()},keyup:function(e){var i=t(e.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),t(e.target).removeClass("ui-state-active"))}}})}(jQuery),function(t){function e(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.widget("ui.spinner",{version:"1.10.3",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e={},i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);void 0!==n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var t=this.element[0]===this.document[0].activeElement;t||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var t=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=t.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*t.height())&&t.height()>0&&t.height(t.height()),this.options.disabled&&this.disable()},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){if("culture"===t||"numberFormat"===t){var i=this._parse(this.element.val());return this.options[t]=e,this.element.val(this._format(i)),void 0}("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(e.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(e.down)),this._super(t,e),"disabled"===t&&(e?(this.element.prop("disabled",!0),this.buttons.button("disable")):(this.element.prop("disabled",!1),this.buttons.button("enable")))},_setOptions:e(function(t){this._super(t),this._value(this.element.val())}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:e(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:e(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:e(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:e(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(e(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}})}(jQuery),function(t,e){function i(){return++n}function s(t){return t.hash.length>1&&decodeURIComponent(t.href.replace(o,""))===decodeURIComponent(location.href.replace(o,""))}var n=0,o=/#.*$/;t.widget("ui.tabs",{version:"1.10.3",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_create:function(){var e=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible).delegate(".ui-tabs-nav > li","mousedown"+this.eventNamespace,function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var i=this.options.active,s=this.options.collapsible,n=location.hash.substring(1);return null===i&&(n&&this.tabs.each(function(s,o){return t(o).attr("aria-controls")===n?(i=s,!1):e}),null===i&&(i=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===i||-1===i)&&(i=this.tabs.length?0:!1)),i!==!1&&(i=this.tabs.index(this.tabs.eq(i)),-1===i&&(i=s?!1:0)),!s&&i===!1&&this.anchors.length&&(i=0),i},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(i){var s=t(this.document[0].activeElement).closest("li"),n=this.tabs.index(s),o=!0;if(!this._handlePageNav(i)){switch(i.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:n++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:o=!1,n--;break;case t.ui.keyCode.END:n=this.anchors.length-1;break;case t.ui.keyCode.HOME:n=0;break;case t.ui.keyCode.SPACE:return i.preventDefault(),clearTimeout(this.activating),this._activate(n),e;case t.ui.keyCode.ENTER:return i.preventDefault(),clearTimeout(this.activating),this._activate(n===this.options.active?!1:n),e;default:return}i.preventDefault(),clearTimeout(this.activating),n=this._focusNextTab(n,o),i.ctrlKey||(s.attr("aria-selected","false"),this.tabs.eq(n).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",n)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.focus())},_handlePageNav:function(i){return i.altKey&&i.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):i.altKey&&i.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):e},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).focus(),t},_setOption:function(t,i){return"active"===t?(this._activate(i),e):"disabled"===t?(this._setupDisabled(i),e):(this._super(t,i),"collapsible"===t&&(this.element.toggleClass("ui-tabs-collapsible",i),i||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(i),"heightStyle"===t&&this._setupHeightStyle(i),e)},_tabId:function(t){return t.attr("aria-controls")||"ui-tabs-"+i()},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-expanded":"false","aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-expanded":"true","aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist"),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=t(),this.anchors.each(function(i,n){var o,a,r,h=t(n).uniqueId().attr("id"),l=t(n).closest("li"),c=l.attr("aria-controls");s(n)?(o=n.hash,a=e.element.find(e._sanitizeSelector(o))):(r=e._tabId(l),o="#"+r,a=e.element.find(o),a.length||(a=e._createPanel(r),a.insertAfter(e.panels[i-1]||e.tablist)),a.attr("aria-live","polite")),a.length&&(e.panels=e.panels.add(a)),c&&l.data("ui-tabs-aria-controls",c),l.attr({"aria-controls":o.substring(1),"aria-labelledby":h}),a.attr("aria-labelledby",h)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.element.find("ol,ul").eq(0)},_createPanel:function(e){return t("<div>").attr("id",e).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(e){t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1);for(var i,s=0;i=this.tabs[s];s++)e===!0||-1!==t.inArray(s,e)?t(i).addClass("ui-state-disabled").attr("aria-disabled","true"):t(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=e},_setupEvents:function(e){var i={click:function(t){t.preventDefault()}};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,h=r?t():this._getPanelForTab(o),l=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:l,newTab:r?t():o,newPanel:h};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),l.length||h.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr({"aria-expanded":"false","aria-hidden":"true"}),i.oldTab.attr("aria-selected","false"),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr({"aria-expanded":"true","aria-hidden":"false"}),i.newTab.attr({"aria-selected":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(t){return"string"==typeof t&&(t=this.anchors.index(this.anchors.filter("[href$='"+t+"']"))),t},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(i){var s=this.options.disabled;s!==!1&&(i===e?s=!1:(i=this._getIndex(i),s=t.isArray(s)?t.map(s,function(t){return t!==i?t:null}):t.map(this.tabs,function(t,e){return e!==i?e:null})),this._setupDisabled(s))},disable:function(i){var s=this.options.disabled;if(s!==!0){if(i===e)s=!0;else{if(i=this._getIndex(i),-1!==t.inArray(i,s))return;s=t.isArray(s)?t.merge([i],s).sort():[i]}this._setupDisabled(s)}},load:function(e,i){e=this._getIndex(e);var n=this,o=this.tabs.eq(e),a=o.find(".ui-tabs-anchor"),r=this._getPanelForTab(o),h={tab:o,panel:r};s(a[0])||(this.xhr=t.ajax(this._ajaxSettings(a,i,h)),this.xhr&&"canceled"!==this.xhr.statusText&&(o.addClass("ui-tabs-loading"),r.attr("aria-busy","true"),this.xhr.success(function(t){setTimeout(function(){r.html(t),n._trigger("load",i,h)},1)}).complete(function(t,e){setTimeout(function(){"abort"===e&&n.panels.stop(!1,!0),o.removeClass("ui-tabs-loading"),r.removeAttr("aria-busy"),t===n.xhr&&delete n.xhr},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href"),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}})}(jQuery),function(t){function e(e,i){var s=(e.attr("aria-describedby")||"").split(/\s+/);s.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(s.join(" ")))}function i(e){var i=e.data("ui-tooltip-id"),s=(e.attr("aria-describedby")||"").split(/\s+/),n=t.inArray(i,s);-1!==n&&s.splice(n,1),e.removeData("ui-tooltip-id"),s=t.trim(s.join(" ")),s?e.attr("aria-describedby",s):e.removeAttr("aria-describedby")}var s=0;t.widget("ui.tooltip",{version:"1.10.3",options:{content:function(){var e=t(this).attr("title")||"";return t("<a>").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable()},_setOption:function(e,i){var s=this;return"disabled"===e?(this[i?"_disable":"_enable"](),this.options[e]=i,void 0):(this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){s._updateContent(e)}),void 0)},_disable:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s[0],e.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var e=t(this);e.is("[title]")&&e.data("ui-tooltip-title",e.attr("title")).attr("title","")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))})},open:function(e){var i=this,s=t(e?e.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&s.parents().each(function(){var e,s=t(this);s.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._updateContent(s,e))},_updateContent:function(t,e){var i,s=this.options.content,n=this,o=e?e.type:null;return"string"==typeof s?this._open(e,t,s):(i=s.call(t[0],function(i){t.data("ui-tooltip-open")&&n._delay(function(){e&&(e.type=o),this._open(e,t,i)})}),i&&this._open(e,t,i),void 0)},_open:function(i,s,n){function o(t){l.of=t,a.is(":hidden")||a.position(l)}var a,r,h,l=t.extend({},this.options.position);</span>&nbsp; <span class='diff-add'>if(n){if(a=this._find(s),a.length)return a.find(".ui-tooltip-content").html(n),void 0;s.is("[title]")&&(i&&"mouseover"===i.type?s.attr("title",""):s.removeAttr("title")),a=this._tooltip(s),e(s,a.attr("id")),a.find(".ui-tooltip-content").html(n),this.options.track&&i&&/^mouse/.test(i.type)?(this._on(this.document,{mousemove:o}),o(i)):a.position(t.extend({of:s},this.options.position)),a.hide(),this._show(a,this.options.show),this.options.show&&this.options.show.delay&&(h=this.delayedShow=setInterval(function(){a.is(":visible")&&(o(l.of),clearInterval(h))},t.fx.interval)),this._trigger("open",i,{tooltip:a}),r={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var i=t.Event(e);i.currentTarget=s[0],this.close(i,!0)}},remove:function(){this._removeTooltip(a)}},i&&"mouseover"!==i.type||(r.mouseleave="close"),i&&"focusin"!==i.type||(r.focusout="close"),this._on(!0,s,r)}},close:function(e){var s=this,n=t(e?e.currentTarget:this.element),o=this._find(n);this.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&n.attr("title",n.data("ui-tooltip-title")),i(n),o.stop(!0),this._hide(o,this.options.hide,function(){s._removeTooltip(t(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete s.parents[e]}),this.closing=!0,this._trigger("close",e,{tooltip:o}),this.closing=!1)},_tooltip:function(e){var i="ui-tooltip-"+s++,n=t("<div>").attr({id:i,role:"tooltip"}).addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||""));return t("<div>").addClass("ui-tooltip-content").appendTo(n),n.appendTo(this.document[0].body),this.tooltips[i]=e,n},_find:function(e){var i=e.data("ui-tooltip-id");return i?t("#"+i):t()},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_destroy:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s[0],e.close(n,!0),t("#"+i).remove(),s.data("ui-tooltip-title")&&(s.attr("title",s.data("ui-tooltip-title")),s.removeData("ui-tooltip-title"))})}})}(jQuery);</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/jquery.min.js b/ipynb/Array-feature-overlap-05_files/jquery.min.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..9a85bd3</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/jquery.min.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license</span>&nbsp; <span class='diff-add'>//@ sourceMappingURL=jquery.min.map</span>&nbsp; <span class='diff-add'>*/</span>&nbsp; <span class='diff-add'>(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)</span>&nbsp; <span class='diff-add'>};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ct={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1></$2>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(xt[0].contentWindow||xt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=Mt(e,t),xt.detach()),Nt[e]=n),n}function Mt(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,t){x.cssHooks[t]={get:function(e,n,r){return n?0===e.offsetWidth&&bt.test(x.css(e,"display"))?x.swap(e,Et,function(){return Pt(e,t,r)}):Pt(e,t,r):undefined},set:function(e,n,r){var i=r&&qt(e);return Ot(e,n,r?Ft(e,t,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,t){return t?x.swap(e,{display:"inline-block"},vt,[e,"marginRight"]):undefined}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,t){x.cssHooks[t]={get:function(e,n){return n?(n=vt(e,t),Ct.test(n)?x(e).position()[t]+"px":n):undefined}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+jt[r]+t]=o[r]||o[r-2]||o[0];return i}},wt.test(e)||(x.cssHooks[e+t].set=Ot)});var Wt=/%20/g,$t=/\[\]$/,Bt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,zt=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&zt.test(this.nodeName)&&!It.test(e)&&(this.checked||!ot.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(Bt,"\r\n")}}):{name:t.name,value:n.replace(Bt,"\r\n")}}).get()}}),x.param=function(e,t){var n,r=[],i=function(e,t){t=x.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(t===undefined&&(t=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){i(this.name,this.value)});else for(n in e)_t(n,e[n],t,i);return r.join("&").replace(Wt,"+")};function _t(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||$t.test(e)?r(e,i):_t(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)_t(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)</span>&nbsp; <span class='diff-add'>},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Xt,Ut,Yt=x.now(),Vt=/\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\/\//,tn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,nn=x.fn.load,rn={},on={},sn="*/".concat("*");try{Ut=i.href}catch(an){Ut=o.createElement("a"),Ut.href="",Ut=Ut.href}Xt=tn.exec(Ut.toLowerCase())||[];function un(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function ln(e,t,n,r){var i={},o=e===on;function s(a){var u;return i[a]=!0,x.each(e[a]||[],function(e,a){var l=a(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):undefined:(t.dataTypes.unshift(l),s(l),!1)}),u}return s(t.dataTypes[0])||!i["*"]&&s("*")}function cn(e,t){var n,r,i=x.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,t,n){if("string"!=typeof e&&nn)return nn.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(" ");return a>=0&&(r=e.slice(a),e=e.slice(0,a)),x.isFunction(t)?(n=t,t=undefined):t&&"object"==typeof t&&(i="POST"),s.length>0&&x.ajax({url:e,type:i,dataType:"html",data:t}).done(function(e){o=arguments,s.html(r?x("<div>").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:"GET",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":sn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks("once memory"),g=c.statusCode||{},m={},y={},v=0,b="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+"").replace(Gt,"").replace(en,Xt[1]+"//"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||"*").toLowerCase().match(w)||[""],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||("http:"===a[1]?"80":"443"))===(Xt[3]||("http:"===Xt[1]?"80":"443")))),c.data&&c.processData&&"string"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger("ajaxStart"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?"&":"?")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,"$1_="+Yt++):r+(Vt.test(r)?"&":"?")+"_="+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader("If-Modified-Since",x.lastModified[r]),x.etag[r]&&T.setRequestHeader("If-None-Match",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader("Content-Type",c.contentType),T.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+("*"!==c.dataTypes[0]?", "+sn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b="abort";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger("ajaxSend",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort("timeout")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||"",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(x.lastModified[r]=w),w=T.getResponseHeader("etag"),w&&(x.etag[r]=w)),204===e||"HEAD"===c.type?C="nocontent":304===e?C="notmodified":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C="error",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+"",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?"ajaxSuccess":"ajaxError",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger("ajaxComplete",[T,c]),--x.active||x.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,t){return x.get(e,undefined,t,"script")}}),x.each(["get","post"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e["throws"])t=s(t);else try{t=s(t)}catch(p){return{state:"parsererror",error:s?p:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),x.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x("<script>").prop({async:!0,charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),o.head.appendChild(t[0])},abort:function(){n&&n()}}}});var hn=[],dn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=hn.pop()||x.expando+"_"+Yt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");return a||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=x.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(Vt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||x.error(i+" was not called"),s[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,hn.push(i)),s&&x.isFunction(o)&&o(s[0]),s=o=undefined}),"script"):undefined}),x.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var gn=x.ajaxSettings.xhr(),mn={0:200,1223:204},yn=0,vn={};e.ActiveXObject&&x(e).on("unload",function(){for(var e in vn)vn[e]();vn=undefined}),x.support.cors=!!gn&&"withCredentials"in gn,x.support.ajax=gn=!!gn,x.ajaxTransport(function(e){var t;return x.support.cors||gn&&!e.crossDomain?{send:function(n,r){var i,o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)s.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete vn[o],t=s.onload=s.onerror=null,"abort"===e?s.abort():"error"===e?r(s.status||404,s.statusText):r(mn[s.status]||s.status,s.statusText,"string"==typeof s.responseText?{text:s.responseText}:undefined,s.getAllResponseHeaders()))}},s.onload=t(),s.onerror=t("error"),t=vn[o=yn++]=t("abort"),s.send(e.hasContent&&e.data||null)},abort:function(){t&&t()}}:undefined});var xn,bn,wn=/^(?:toggle|show|hide)$/,Tn=RegExp("^(?:([+-])=|)("+b+")([a-z%]*)$","i"),Cn=/queueHooks$/,kn=[An],Nn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Tn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),s=(x.cssNumber[e]||"px"!==o&&+r)&&Tn.exec(x.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||".5",s/=a,x.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};function En(){return setTimeout(function(){xn=undefined}),xn=x.now()}function Sn(e,t,n){var r,i=(Nn[t]||[]).concat(Nn["*"]),o=0,s=i.length;for(;s>o;o++)if(r=i[o].call(n,t,e))return r}function jn(e,t,n){var r,i,o=0,s=kn.length,a=x.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=xn||En(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;for(;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:xn||En(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(Dn(c,l.opts.specialEasing);s>o;o++)if(r=kn[o].call(l,e,c,l.opts))return r;return x.map(c,Sn,l),x.isFunction(l.opts.start)&&l.opts.start.call(e,l),x.fx.timer(x.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function Dn(e,t){var n,r,i,o,s;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=x.cssHooks[r],s&&"expand"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(jn,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Nn[n]=Nn[n]||[],Nn[n].unshift(t)},prefilter:function(e,t){t?kn.unshift(e):kn.push(e)}});function An(e,t,n){var r,i,o,s,a,u,l=this,c={},p=e.style,f=e.nodeType&&Lt(e),h=q.get(e,"fxshow");n.queue||(a=x._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,l.always(function(){l.always(function(){a.unqueued--,x.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(p.display="inline-block")),n.overflow&&(p.overflow="hidden",l.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],wn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show")){if("show"!==i||!h||h[r]===undefined)continue;f=!0}c[r]=h&&h[r]||x.style(e,r)}if(!x.isEmptyObject(c)){h?"hidden"in h&&(f=h.hidden):h=q.access(e,"fxshow",{}),o&&(h.hidden=!f),f?x(e).show():l.done(function(){x(e).hide()}),l.done(function(){var t;q.remove(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)s=Sn(f?h[r]:0,r,l),r in h||(h[r]=s.start,f&&(s.end=s.start,s.start="width"===r||"height"===r?1:0))}}function Ln(e,t,n,r,i){return new Ln.prototype.init(e,t,n,r,i)}x.Tween=Ln,Ln.prototype={constructor:Ln,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=Ln.propHooks[this.prop];return e&&e.get?e.get(this):Ln.propHooks._default.get(this)},run:function(e){var t,n=Ln.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ln.propHooks._default.set(this),this}},Ln.prototype.init.prototype=Ln.prototype,Ln.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ln.propHooks.scrollTop=Ln.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(qn(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),s=function(){var t=jn(this,x.extend({},e),o);(i||q.get(this,"finish"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=x.timers,s=q.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Cn.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=q.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,s=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function qn(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=jt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:qn("show"),slideUp:qn("hide"),slideToggle:qn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=Ln.prototype.init,x.fx.tick=function(){var e,t=x.timers,n=0;for(xn=x.now();t.length>n;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||x.fx.stop(),xn=undefined},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){bn||(bn=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(bn),bn=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===undefined?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0],o={top:0,left:0},s=i&&i.ownerDocument;if(s)return t=s.documentElement,x.contains(t,i)?(typeof i.getBoundingClientRect!==r&&(o=i.getBoundingClientRect()),n=Hn(s),{top:o.top+n.pageYOffset-t.clientTop,left:o.left+n.pageXOffset-t.clientLeft}):o},x.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=x.css(e,"position"),p=x(e),f={};"static"===c&&(e.style.position="relative"),a=p.offset(),o=x.css(e,"top"),u=x.css(e,"left"),l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1,l?(r=p.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),x.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+i),"using"in t?t.using.call(e,f):p.css(f)}},x.fn.extend({position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===x.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(r=e.offset()),r.top+=x.css(e[0],"borderTopWidth",!0),r.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-x.css(n,"marginTop",!0),left:t.left-r.left-x.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,n){var r="pageYOffset"===n;x.fn[t]=function(i){return x.access(this,function(t,i,o){var s=Hn(t);return o===undefined?s?s[n]:t[i]:(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o,undefined)},t,i,arguments.length,null)}});function Hn(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){x.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),s=n||(r===!0||i===!0?"margin":"border");return x.access(this,function(t,n,r){var i;return x.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):r===undefined?x.css(t,n,s):x.style(t,n,r,s)},t,o?r:undefined,o,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}),"object"==typeof e&&"object"==typeof e.document&&(e.jQuery=e.$=x)})(window);</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/kernel.js b/ipynb/Array-feature-overlap-05_files/kernel.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..f414507</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/kernel.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> './comm',</span>&nbsp; <span class='diff-add'> './serialize',</span>&nbsp; <span class='diff-add'> 'widgets/js/init'</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils, comm, serialize, widgetmanager) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * A Kernel class to communicate with the Python kernel. This</span>&nbsp; <span class='diff-add'> * should generally not be constructed directly, but be created</span>&nbsp; <span class='diff-add'> * by. the `Session` object. Once created, this object should be</span>&nbsp; <span class='diff-add'> * used to communicate with the kernel.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @class Kernel</span>&nbsp; <span class='diff-add'> * @param {string} kernel_service_url - the URL to access the kernel REST api</span>&nbsp; <span class='diff-add'> * @param {string} ws_url - the websockets URL</span>&nbsp; <span class='diff-add'> * @param {Notebook} notebook - notebook object</span>&nbsp; <span class='diff-add'> * @param {string} name - the kernel type (e.g. python3)</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var Kernel = function (kernel_service_url, ws_url, notebook, name) {</span>&nbsp; <span class='diff-add'> this.events = notebook.events;</span>&nbsp; <span class='diff-add'> this.id = null;</span>&nbsp; <span class='diff-add'> this.name = name;</span>&nbsp; <span class='diff-add'> this.ws = null;</span>&nbsp; <span class='diff-add'> this.kernel_service_url = kernel_service_url;</span>&nbsp; <span class='diff-add'> this.kernel_url = null;</span>&nbsp; <span class='diff-add'> this.ws_url = ws_url || IPython.utils.get_body_data("wsUrl");</span>&nbsp; <span class='diff-add'> if (!this.ws_url) {</span>&nbsp; <span class='diff-add'> // trailing 's' in https will become wss for secure web sockets</span>&nbsp; <span class='diff-add'> this.ws_url = location.protocol.replace('http', 'ws') + "//" + location.host;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.username = "username";</span>&nbsp; <span class='diff-add'> this.session_id = utils.uuid();</span>&nbsp; <span class='diff-add'> this._msg_callbacks = {};</span>&nbsp; <span class='diff-add'> this.info_reply = {}; // kernel_info_reply stored here after starting</span>&nbsp; <span class='diff-add'> if (typeof(WebSocket) !== 'undefined') {</span>&nbsp; <span class='diff-add'> this.WebSocket = WebSocket;</span>&nbsp; <span class='diff-add'> } else if (typeof(MozWebSocket) !== 'undefined') {</span>&nbsp; <span class='diff-add'> this.WebSocket = MozWebSocket;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> alert('Your browser does not have WebSocket support, please try Chrome, Safari or Firefox ≥ 6. Firefox 4 and 5 are also supported by you have to enable WebSockets in about:config.');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> this.init_iopub_handlers();</span>&nbsp; <span class='diff-add'> this.comm_manager = new comm.CommManager(this);</span>&nbsp; <span class='diff-add'> this.widget_manager = new widgetmanager.WidgetManager(this.comm_manager, notebook);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.last_msg_id = null;</span>&nbsp; <span class='diff-add'> this.last_msg_callbacks = {};</span>&nbsp; <span class='diff-add'> this._autorestart_attempt = 0;</span>&nbsp; <span class='diff-add'> this._reconnect_attempt = 0;</span>&nbsp; <span class='diff-add'> this.reconnect_limit = 7;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @function _get_msg</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype._get_msg = function (msg_type, content, metadata, buffers) {</span>&nbsp; <span class='diff-add'> var msg = {</span>&nbsp; <span class='diff-add'> header : {</span>&nbsp; <span class='diff-add'> msg_id : utils.uuid(),</span>&nbsp; <span class='diff-add'> username : this.username,</span>&nbsp; <span class='diff-add'> session : this.session_id,</span>&nbsp; <span class='diff-add'> msg_type : msg_type,</span>&nbsp; <span class='diff-add'> version : "5.0"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> metadata : metadata || {},</span>&nbsp; <span class='diff-add'> content : content,</span>&nbsp; <span class='diff-add'> buffers : buffers || [],</span>&nbsp; <span class='diff-add'> parent_header : {}</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return msg;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @function bind_events</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.events.on('send_input_reply.Kernel', function(evt, data) { </span>&nbsp; <span class='diff-add'> that.send_input_reply(data);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var record_status = function (evt, info) {</span>&nbsp; <span class='diff-add'> console.log('Kernel: ' + evt.type + ' (' + info.kernel.id + ')');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.events.on('kernel_created.Kernel', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_reconnecting.Kernel', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_connected.Kernel', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_starting.Kernel', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_restarting.Kernel', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_autorestarting.Kernel', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_interrupting.Kernel', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_disconnected.Kernel', record_status);</span>&nbsp; <span class='diff-add'> // these are commented out because they are triggered a lot, but can</span>&nbsp; <span class='diff-add'> // be uncommented for debugging purposes</span>&nbsp; <span class='diff-add'> //this.events.on('kernel_idle.Kernel', record_status);</span>&nbsp; <span class='diff-add'> //this.events.on('kernel_busy.Kernel', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_ready.Kernel', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_killed.Kernel', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_dead.Kernel', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_ready.Kernel', function () {</span>&nbsp; <span class='diff-add'> that._autorestart_attempt = 0;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_connected.Kernel', function () {</span>&nbsp; <span class='diff-add'> that._reconnect_attempt = 0;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Initialize the iopub handlers.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function init_iopub_handlers</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.init_iopub_handlers = function () {</span>&nbsp; <span class='diff-add'> var output_msg_types = ['stream', 'display_data', 'execute_result', 'error'];</span>&nbsp; <span class='diff-add'> this._iopub_handlers = {};</span>&nbsp; <span class='diff-add'> this.register_iopub_handler('status', $.proxy(this._handle_status_message, this));</span>&nbsp; <span class='diff-add'> this.register_iopub_handler('clear_output', $.proxy(this._handle_clear_output, this));</span>&nbsp; <span class='diff-add'> this.register_iopub_handler('execute_input', $.proxy(this._handle_input_message, this));</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> for (var i=0; i < output_msg_types.length; i++) {</span>&nbsp; <span class='diff-add'> this.register_iopub_handler(output_msg_types[i], $.proxy(this._handle_output_message, this));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * GET /api/kernels</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Get the list of running kernels.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function list</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.list = function (success, error) {</span>&nbsp; <span class='diff-add'> $.ajax(this.kernel_service_url, {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "GET",</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> success: success,</span>&nbsp; <span class='diff-add'> error: this._on_error(error)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * POST /api/kernels</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Start a new kernel.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * In general this shouldn't be used -- the kernel should be</span>&nbsp; <span class='diff-add'> * started through the session API. If you use this function and</span>&nbsp; <span class='diff-add'> * are also using the session API then your session and kernel</span>&nbsp; <span class='diff-add'> * WILL be out of sync!</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function start</span>&nbsp; <span class='diff-add'> * @param {params} [Object] - parameters to include in the query string</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.start = function (params, success, error) {</span>&nbsp; <span class='diff-add'> var url = this.kernel_service_url;</span>&nbsp; <span class='diff-add'> var qs = $.param(params || {}); // query string for sage math stuff</span>&nbsp; <span class='diff-add'> if (qs !== "") {</span>&nbsp; <span class='diff-add'> url = url + "?" + qs;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_starting.Kernel', {kernel: this});</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var on_success = function (data, status, xhr) {</span>&nbsp; <span class='diff-add'> that.events.trigger('kernel_created.Kernel', {kernel: that});</span>&nbsp; <span class='diff-add'> that._kernel_created(data);</span>&nbsp; <span class='diff-add'> if (success) {</span>&nbsp; <span class='diff-add'> success(data, status, xhr);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> $.ajax(url, {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "POST",</span>&nbsp; <span class='diff-add'> data: JSON.stringify({name: this.name}),</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> success: this._on_success(on_success),</span>&nbsp; <span class='diff-add'> error: this._on_error(error)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return url;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * GET /api/kernels/[:kernel_id]</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Get information about the kernel.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function get_info</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.get_info = function (success, error) {</span>&nbsp; <span class='diff-add'> $.ajax(this.kernel_url, {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "GET",</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> success: this._on_success(success),</span>&nbsp; <span class='diff-add'> error: this._on_error(error)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * DELETE /api/kernels/[:kernel_id]</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Shutdown the kernel.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * If you are also using sessions, then this function shoul NOT be</span>&nbsp; <span class='diff-add'> * used. Instead, use Session.delete. Otherwise, the session and</span>&nbsp; <span class='diff-add'> * kernel WILL be out of sync.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function kill</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.kill = function (success, error) {</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_killed.Kernel', {kernel: this});</span>&nbsp; <span class='diff-add'> this._kernel_dead();</span>&nbsp; <span class='diff-add'> $.ajax(this.kernel_url, {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "DELETE",</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> success: this._on_success(success),</span>&nbsp; <span class='diff-add'> error: this._on_error(error)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * POST /api/kernels/[:kernel_id]/interrupt</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Interrupt the kernel.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function interrupt</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.interrupt = function (success, error) {</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_interrupting.Kernel', {kernel: this});</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var on_success = function (data, status, xhr) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * get kernel info so we know what state the kernel is in</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> that.kernel_info();</span>&nbsp; <span class='diff-add'> if (success) {</span>&nbsp; <span class='diff-add'> success(data, status, xhr);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var url = utils.url_join_encode(this.kernel_url, 'interrupt');</span>&nbsp; <span class='diff-add'> $.ajax(url, {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "POST",</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> success: this._on_success(on_success),</span>&nbsp; <span class='diff-add'> error: this._on_error(error)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype.restart = function (success, error) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * POST /api/kernels/[:kernel_id]/restart</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Restart the kernel.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function interrupt</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_restarting.Kernel', {kernel: this});</span>&nbsp; <span class='diff-add'> this.stop_channels();</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var on_success = function (data, status, xhr) {</span>&nbsp; <span class='diff-add'> that.events.trigger('kernel_created.Kernel', {kernel: that});</span>&nbsp; <span class='diff-add'> that._kernel_created(data);</span>&nbsp; <span class='diff-add'> if (success) {</span>&nbsp; <span class='diff-add'> success(data, status, xhr);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var on_error = function (xhr, status, err) {</span>&nbsp; <span class='diff-add'> that.events.trigger('kernel_dead.Kernel', {kernel: that});</span>&nbsp; <span class='diff-add'> that._kernel_dead();</span>&nbsp; <span class='diff-add'> if (error) {</span>&nbsp; <span class='diff-add'> error(xhr, status, err);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var url = utils.url_join_encode(this.kernel_url, 'restart');</span>&nbsp; <span class='diff-add'> $.ajax(url, {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "POST",</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> success: this._on_success(on_success),</span>&nbsp; <span class='diff-add'> error: this._on_error(on_error)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype.reconnect = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Reconnect to a disconnected kernel. This is not actually a</span>&nbsp; <span class='diff-add'> * standard HTTP request, but useful function nonetheless for</span>&nbsp; <span class='diff-add'> * reconnecting to the kernel if the connection is somehow lost.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function reconnect</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this.is_connected()) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._reconnect_attempt = this._reconnect_attempt + 1;</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_reconnecting.Kernel', {</span>&nbsp; <span class='diff-add'> kernel: this,</span>&nbsp; <span class='diff-add'> attempt: this._reconnect_attempt,</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.start_channels();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype._on_success = function (success) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle a successful AJAX request by updating the kernel id and</span>&nbsp; <span class='diff-add'> * name from the response, and then optionally calling a provided</span>&nbsp; <span class='diff-add'> * callback.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _on_success</span>&nbsp; <span class='diff-add'> * @param {function} success - callback</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return function (data, status, xhr) {</span>&nbsp; <span class='diff-add'> if (data) {</span>&nbsp; <span class='diff-add'> that.id = data.id;</span>&nbsp; <span class='diff-add'> that.name = data.name;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> that.kernel_url = utils.url_join_encode(that.kernel_service_url, that.id);</span>&nbsp; <span class='diff-add'> if (success) {</span>&nbsp; <span class='diff-add'> success(data, status, xhr);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype._on_error = function (error) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle a failed AJAX request by logging the error message, and</span>&nbsp; <span class='diff-add'> * then optionally calling a provided callback.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _on_error</span>&nbsp; <span class='diff-add'> * @param {function} error - callback</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return function (xhr, status, err) {</span>&nbsp; <span class='diff-add'> utils.log_ajax_error(xhr, status, err);</span>&nbsp; <span class='diff-add'> if (error) {</span>&nbsp; <span class='diff-add'> error(xhr, status, err);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype._kernel_created = function (data) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Perform necessary tasks once the kernel has been started,</span>&nbsp; <span class='diff-add'> * including actually connecting to the kernel.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _kernel_created</span>&nbsp; <span class='diff-add'> * @param {Object} data - information about the kernel including id</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.id = data.id;</span>&nbsp; <span class='diff-add'> this.kernel_url = utils.url_join_encode(this.kernel_service_url, this.id);</span>&nbsp; <span class='diff-add'> this.start_channels();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype._kernel_connected = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Perform necessary tasks once the connection to the kernel has</span>&nbsp; <span class='diff-add'> * been established. This includes requesting information about</span>&nbsp; <span class='diff-add'> * the kernel.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _kernel_connected</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_connected.Kernel', {kernel: this});</span>&nbsp; <span class='diff-add'> // get kernel info so we know what state the kernel is in</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.kernel_info(function (reply) {</span>&nbsp; <span class='diff-add'> that.info_reply = reply.content;</span>&nbsp; <span class='diff-add'> that.events.trigger('kernel_ready.Kernel', {kernel: that});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype._kernel_dead = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Perform necessary tasks after the kernel has died. This closing</span>&nbsp; <span class='diff-add'> * communication channels to the kernel if they are still somehow</span>&nbsp; <span class='diff-add'> * open.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _kernel_dead</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.stop_channels();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype.start_channels = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Start the websocket channels.</span>&nbsp; <span class='diff-add'> * Will stop and restart them if they already exist.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function start_channels</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.stop_channels();</span>&nbsp; <span class='diff-add'> var ws_host_url = this.ws_url + this.kernel_url;</span>&nbsp; <span class='diff-add'> console.log("Starting WebSockets:", ws_host_url);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.ws = new this.WebSocket([</span>&nbsp; <span class='diff-add'> that.ws_url,</span>&nbsp; <span class='diff-add'> utils.url_join_encode(that.kernel_url, 'channels'),</span>&nbsp; <span class='diff-add'> "?session_id=" + that.session_id</span>&nbsp; <span class='diff-add'> ].join('')</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var already_called_onclose = false; // only alert once</span>&nbsp; <span class='diff-add'> var ws_closed_early = function(evt){</span>&nbsp; <span class='diff-add'> if (already_called_onclose){</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> already_called_onclose = true;</span>&nbsp; <span class='diff-add'> if ( ! evt.wasClean ){</span>&nbsp; <span class='diff-add'> // If the websocket was closed early, that could mean</span>&nbsp; <span class='diff-add'> // that the kernel is actually dead. Try getting</span>&nbsp; <span class='diff-add'> // information about the kernel from the API call --</span>&nbsp; <span class='diff-add'> // if that fails, then assume the kernel is dead,</span>&nbsp; <span class='diff-add'> // otherwise just follow the typical websocket closed</span>&nbsp; <span class='diff-add'> // protocol.</span>&nbsp; <span class='diff-add'> that.get_info(function () {</span>&nbsp; <span class='diff-add'> that._ws_closed(ws_host_url, false);</span>&nbsp; <span class='diff-add'> }, function () {</span>&nbsp; <span class='diff-add'> that.events.trigger('kernel_dead.Kernel', {kernel: that});</span>&nbsp; <span class='diff-add'> that._kernel_dead();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var ws_closed_late = function(evt){</span>&nbsp; <span class='diff-add'> if (already_called_onclose){</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> already_called_onclose = true;</span>&nbsp; <span class='diff-add'> if ( ! evt.wasClean ){</span>&nbsp; <span class='diff-add'> that._ws_closed(ws_host_url, false);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var ws_error = function(evt){</span>&nbsp; <span class='diff-add'> if (already_called_onclose){</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> already_called_onclose = true;</span>&nbsp; <span class='diff-add'> that._ws_closed(ws_host_url, true);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.ws.onopen = $.proxy(this._ws_opened, this);</span>&nbsp; <span class='diff-add'> this.ws.onclose = ws_closed_early;</span>&nbsp; <span class='diff-add'> this.ws.onerror = ws_error;</span>&nbsp; <span class='diff-add'> // switch from early-close to late-close message after 1s</span>&nbsp; <span class='diff-add'> setTimeout(function() {</span>&nbsp; <span class='diff-add'> if (that.ws !== null) {</span>&nbsp; <span class='diff-add'> that.ws.onclose = ws_closed_late;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, 1000);</span>&nbsp; <span class='diff-add'> this.ws.onmessage = $.proxy(this._handle_ws_message, this);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype._ws_opened = function (evt) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle a websocket entering the open state,</span>&nbsp; <span class='diff-add'> * signaling that the kernel is connected when websocket is open.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _ws_opened</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this.is_connected()) {</span>&nbsp; <span class='diff-add'> // all events ready, trigger started event.</span>&nbsp; <span class='diff-add'> this._kernel_connected();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype._ws_closed = function(ws_url, error) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle a websocket entering the closed state. If the websocket</span>&nbsp; <span class='diff-add'> * was not closed due to an error, try to reconnect to the kernel.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _ws_closed</span>&nbsp; <span class='diff-add'> * @param {string} ws_url - the websocket url</span>&nbsp; <span class='diff-add'> * @param {bool} error - whether the connection was closed due to an error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.stop_channels();</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_disconnected.Kernel', {kernel: this});</span>&nbsp; <span class='diff-add'> if (error) {</span>&nbsp; <span class='diff-add'> console.log('WebSocket connection failed: ', ws_url);</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_connection_failed.Kernel', {kernel: this, ws_url: ws_url, attempt: this._reconnect_attempt});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._schedule_reconnect();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Kernel.prototype._schedule_reconnect = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * function to call when kernel connection is lost</span>&nbsp; <span class='diff-add'> * schedules reconnect, or fires 'connection_dead' if reconnect limit is hit</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this._reconnect_attempt < this.reconnect_limit) {</span>&nbsp; <span class='diff-add'> var timeout = Math.pow(2, this._reconnect_attempt);</span>&nbsp; <span class='diff-add'> console.log("Connection lost, reconnecting in " + timeout + " seconds.");</span>&nbsp; <span class='diff-add'> setTimeout($.proxy(this.reconnect, this), 1e3 * timeout);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_connection_dead.Kernel', {</span>&nbsp; <span class='diff-add'> kernel: this,</span>&nbsp; <span class='diff-add'> reconnect_attempt: this._reconnect_attempt,</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> console.log("Failed to reconnect, giving up.");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Kernel.prototype.stop_channels = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Close the websocket. After successful close, the value</span>&nbsp; <span class='diff-add'> * in `this.ws` will be null.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function stop_channels</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var close = function () {</span>&nbsp; <span class='diff-add'> if (that.ws && that.ws.readyState === WebSocket.CLOSED) {</span>&nbsp; <span class='diff-add'> that.ws = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (this.ws !== null) {</span>&nbsp; <span class='diff-add'> if (this.ws.readyState === WebSocket.OPEN) {</span>&nbsp; <span class='diff-add'> this.ws.onclose = close;</span>&nbsp; <span class='diff-add'> this.ws.close();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> close();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype.is_connected = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Check whether there is a connection to the kernel. This</span>&nbsp; <span class='diff-add'> * function only returns true if websocket has been</span>&nbsp; <span class='diff-add'> * created and has a state of WebSocket.OPEN.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function is_connected</span>&nbsp; <span class='diff-add'> * @returns {bool} - whether there is a connection</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> // if any channel is not ready, then we're not connected</span>&nbsp; <span class='diff-add'> if (this.ws === null) {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.ws.readyState !== WebSocket.OPEN) {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype.is_fully_disconnected = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Check whether the connection to the kernel has been completely</span>&nbsp; <span class='diff-add'> * severed. This function only returns true if all channel objects</span>&nbsp; <span class='diff-add'> * are null.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function is_fully_disconnected</span>&nbsp; <span class='diff-add'> * @returns {bool} - whether the kernel is fully disconnected</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return (this.ws === null);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Kernel.prototype.send_shell_message = function (msg_type, content, callbacks, metadata, buffers) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Send a message on the Kernel's shell channel</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function send_shell_message</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (!this.is_connected()) {</span>&nbsp; <span class='diff-add'> throw new Error("kernel is not connected");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var msg = this._get_msg(msg_type, content, metadata, buffers);</span>&nbsp; <span class='diff-add'> msg.channel = 'shell';</span>&nbsp; <span class='diff-add'> this.ws.send(serialize.serialize(msg));</span>&nbsp; <span class='diff-add'> this.set_callbacks_for_msg(msg.header.msg_id, callbacks);</span>&nbsp; <span class='diff-add'> return msg.header.msg_id;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype.kernel_info = function (callback) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get kernel info</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function kernel_info</span>&nbsp; <span class='diff-add'> * @param callback {function}</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * When calling this method, pass a callback function that expects one argument.</span>&nbsp; <span class='diff-add'> * The callback will be passed the complete `kernel_info_reply` message documented</span>&nbsp; <span class='diff-add'> * [here](http://ipython.org/ipython-doc/dev/development/messaging.html#kernel-info)</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var callbacks;</span>&nbsp; <span class='diff-add'> if (callback) {</span>&nbsp; <span class='diff-add'> callbacks = { shell : { reply : callback } };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.send_shell_message("kernel_info_request", {}, callbacks);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype.inspect = function (code, cursor_pos, callback) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get info on an object</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * When calling this method, pass a callback function that expects one argument.</span>&nbsp; <span class='diff-add'> * The callback will be passed the complete `inspect_reply` message documented</span>&nbsp; <span class='diff-add'> * [here](http://ipython.org/ipython-doc/dev/development/messaging.html#object-information)</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function inspect</span>&nbsp; <span class='diff-add'> * @param code {string}</span>&nbsp; <span class='diff-add'> * @param cursor_pos {integer}</span>&nbsp; <span class='diff-add'> * @param callback {function}</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var callbacks;</span>&nbsp; <span class='diff-add'> if (callback) {</span>&nbsp; <span class='diff-add'> callbacks = { shell : { reply : callback } };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var content = {</span>&nbsp; <span class='diff-add'> code : code,</span>&nbsp; <span class='diff-add'> cursor_pos : cursor_pos,</span>&nbsp; <span class='diff-add'> detail_level : 0</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return this.send_shell_message("inspect_request", content, callbacks);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype.execute = function (code, callbacks, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Execute given code into kernel, and pass result to callback.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @async</span>&nbsp; <span class='diff-add'> * @function execute</span>&nbsp; <span class='diff-add'> * @param {string} code</span>&nbsp; <span class='diff-add'> * @param [callbacks] {Object} With the following keys (all optional)</span>&nbsp; <span class='diff-add'> * @param callbacks.shell.reply {function}</span>&nbsp; <span class='diff-add'> * @param callbacks.shell.payload.[payload_name] {function}</span>&nbsp; <span class='diff-add'> * @param callbacks.iopub.output {function}</span>&nbsp; <span class='diff-add'> * @param callbacks.iopub.clear_output {function}</span>&nbsp; <span class='diff-add'> * @param callbacks.input {function}</span>&nbsp; <span class='diff-add'> * @param {object} [options]</span>&nbsp; <span class='diff-add'> * @param [options.silent=false] {Boolean}</span>&nbsp; <span class='diff-add'> * @param [options.user_expressions=empty_dict] {Dict}</span>&nbsp; <span class='diff-add'> * @param [options.allow_stdin=false] {Boolean} true|false</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @example</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * The options object should contain the options for the execute</span>&nbsp; <span class='diff-add'> * call. Its default values are:</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * options = {</span>&nbsp; <span class='diff-add'> * silent : true,</span>&nbsp; <span class='diff-add'> * user_expressions : {},</span>&nbsp; <span class='diff-add'> * allow_stdin : false</span>&nbsp; <span class='diff-add'> * }</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * When calling this method pass a callbacks structure of the</span>&nbsp; <span class='diff-add'> * form:</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * callbacks = {</span>&nbsp; <span class='diff-add'> * shell : {</span>&nbsp; <span class='diff-add'> * reply : execute_reply_callback,</span>&nbsp; <span class='diff-add'> * payload : {</span>&nbsp; <span class='diff-add'> * set_next_input : set_next_input_callback,</span>&nbsp; <span class='diff-add'> * }</span>&nbsp; <span class='diff-add'> * },</span>&nbsp; <span class='diff-add'> * iopub : {</span>&nbsp; <span class='diff-add'> * output : output_callback,</span>&nbsp; <span class='diff-add'> * clear_output : clear_output_callback,</span>&nbsp; <span class='diff-add'> * },</span>&nbsp; <span class='diff-add'> * input : raw_input_callback</span>&nbsp; <span class='diff-add'> * }</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Each callback will be passed the entire message as a single</span>&nbsp; <span class='diff-add'> * arugment. Payload handlers will be passed the corresponding</span>&nbsp; <span class='diff-add'> * payload and the execute_reply message.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var content = {</span>&nbsp; <span class='diff-add'> code : code,</span>&nbsp; <span class='diff-add'> silent : true,</span>&nbsp; <span class='diff-add'> store_history : false,</span>&nbsp; <span class='diff-add'> user_expressions : {},</span>&nbsp; <span class='diff-add'> allow_stdin : false</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> callbacks = callbacks || {};</span>&nbsp; <span class='diff-add'> if (callbacks.input !== undefined) {</span>&nbsp; <span class='diff-add'> content.allow_stdin = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> $.extend(true, content, options);</span>&nbsp; <span class='diff-add'> this.events.trigger('execution_request.Kernel', {kernel: this, content: content});</span>&nbsp; <span class='diff-add'> return this.send_shell_message("execute_request", content, callbacks);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * When calling this method, pass a function to be called with the</span>&nbsp; <span class='diff-add'> * `complete_reply` message as its only argument when it arrives.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * `complete_reply` is documented</span>&nbsp; <span class='diff-add'> * [here](http://ipython.org/ipython-doc/dev/development/messaging.html#complete)</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function complete</span>&nbsp; <span class='diff-add'> * @param code {string}</span>&nbsp; <span class='diff-add'> * @param cursor_pos {integer}</span>&nbsp; <span class='diff-add'> * @param callback {function}</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.complete = function (code, cursor_pos, callback) {</span>&nbsp; <span class='diff-add'> var callbacks;</span>&nbsp; <span class='diff-add'> if (callback) {</span>&nbsp; <span class='diff-add'> callbacks = { shell : { reply : callback } };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var content = {</span>&nbsp; <span class='diff-add'> code : code,</span>&nbsp; <span class='diff-add'> cursor_pos : cursor_pos</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return this.send_shell_message("complete_request", content, callbacks);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @function send_input_reply</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.send_input_reply = function (input) {</span>&nbsp; <span class='diff-add'> if (!this.is_connected()) {</span>&nbsp; <span class='diff-add'> throw new Error("kernel is not connected");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var content = {</span>&nbsp; <span class='diff-add'> value : input</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.events.trigger('input_reply.Kernel', {kernel: this, content: content});</span>&nbsp; <span class='diff-add'> var msg = this._get_msg("input_reply", content);</span>&nbsp; <span class='diff-add'> msg.channel = 'stdin';</span>&nbsp; <span class='diff-add'> this.ws.send(serialize.serialize(msg));</span>&nbsp; <span class='diff-add'> return msg.header.msg_id;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @function register_iopub_handler</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.register_iopub_handler = function (msg_type, callback) {</span>&nbsp; <span class='diff-add'> this._iopub_handlers[msg_type] = callback;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get the iopub handler for a specific message type.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function get_iopub_handler</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.get_iopub_handler = function (msg_type) {</span>&nbsp; <span class='diff-add'> return this._iopub_handlers[msg_type];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get callbacks for a specific message.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function get_callbacks_for_msg</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.get_callbacks_for_msg = function (msg_id) {</span>&nbsp; <span class='diff-add'> if (msg_id == this.last_msg_id) {</span>&nbsp; <span class='diff-add'> return this.last_msg_callbacks;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return this._msg_callbacks[msg_id];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Clear callbacks for a specific message.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function clear_callbacks_for_msg</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.clear_callbacks_for_msg = function (msg_id) {</span>&nbsp; <span class='diff-add'> if (this._msg_callbacks[msg_id] !== undefined ) {</span>&nbsp; <span class='diff-add'> delete this._msg_callbacks[msg_id];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @function _finish_shell</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype._finish_shell = function (msg_id) {</span>&nbsp; <span class='diff-add'> var callbacks = this._msg_callbacks[msg_id];</span>&nbsp; <span class='diff-add'> if (callbacks !== undefined) {</span>&nbsp; <span class='diff-add'> callbacks.shell_done = true;</span>&nbsp; <span class='diff-add'> if (callbacks.iopub_done) {</span>&nbsp; <span class='diff-add'> this.clear_callbacks_for_msg(msg_id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @function _finish_iopub</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype._finish_iopub = function (msg_id) {</span>&nbsp; <span class='diff-add'> var callbacks = this._msg_callbacks[msg_id];</span>&nbsp; <span class='diff-add'> if (callbacks !== undefined) {</span>&nbsp; <span class='diff-add'> callbacks.iopub_done = true;</span>&nbsp; <span class='diff-add'> if (callbacks.shell_done) {</span>&nbsp; <span class='diff-add'> this.clear_callbacks_for_msg(msg_id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set callbacks for a particular message.</span>&nbsp; <span class='diff-add'> * Callbacks should be a struct of the following form:</span>&nbsp; <span class='diff-add'> * shell : {</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * }</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function set_callbacks_for_msg</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype.set_callbacks_for_msg = function (msg_id, callbacks) {</span>&nbsp; <span class='diff-add'> this.last_msg_id = msg_id;</span>&nbsp; <span class='diff-add'> if (callbacks) {</span>&nbsp; <span class='diff-add'> // shallow-copy mapping, because we will modify it at the top level</span>&nbsp; <span class='diff-add'> var cbcopy = this._msg_callbacks[msg_id] = this.last_msg_callbacks = {};</span>&nbsp; <span class='diff-add'> cbcopy.shell = callbacks.shell;</span>&nbsp; <span class='diff-add'> cbcopy.iopub = callbacks.iopub;</span>&nbsp; <span class='diff-add'> cbcopy.input = callbacks.input;</span>&nbsp; <span class='diff-add'> cbcopy.shell_done = (!callbacks.shell);</span>&nbsp; <span class='diff-add'> cbcopy.iopub_done = (!callbacks.iopub);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.last_msg_callbacks = {};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Kernel.prototype._handle_ws_message = function (e) {</span>&nbsp; <span class='diff-add'> serialize.deserialize(e.data, $.proxy(this._finish_ws_message, this));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Kernel.prototype._finish_ws_message = function (msg) {</span>&nbsp; <span class='diff-add'> switch (msg.channel) {</span>&nbsp; <span class='diff-add'> case 'shell':</span>&nbsp; <span class='diff-add'> this._handle_shell_reply(msg);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'iopub':</span>&nbsp; <span class='diff-add'> this._handle_iopub_message(msg);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'stdin':</span>&nbsp; <span class='diff-add'> this._handle_input_request(msg);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> default:</span>&nbsp; <span class='diff-add'> console.error("unrecognized message channel", msg.channel, msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Kernel.prototype._handle_shell_reply = function (reply) {</span>&nbsp; <span class='diff-add'> this.events.trigger('shell_reply.Kernel', {kernel: this, reply:reply});</span>&nbsp; <span class='diff-add'> var content = reply.content;</span>&nbsp; <span class='diff-add'> var metadata = reply.metadata;</span>&nbsp; <span class='diff-add'> var parent_id = reply.parent_header.msg_id;</span>&nbsp; <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(parent_id);</span>&nbsp; <span class='diff-add'> if (!callbacks || !callbacks.shell) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var shell_callbacks = callbacks.shell;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // signal that shell callbacks are done</span>&nbsp; <span class='diff-add'> this._finish_shell(parent_id);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (shell_callbacks.reply !== undefined) {</span>&nbsp; <span class='diff-add'> shell_callbacks.reply(reply);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (content.payload && shell_callbacks.payload) {</span>&nbsp; <span class='diff-add'> this._handle_payloads(content.payload, shell_callbacks.payload, reply);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @function _handle_payloads</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype._handle_payloads = function (payloads, payload_callbacks, msg) {</span>&nbsp; <span class='diff-add'> var l = payloads.length;</span>&nbsp; <span class='diff-add'> // Payloads are handled by triggering events because we don't want the Kernel</span>&nbsp; <span class='diff-add'> // to depend on the Notebook or Pager classes.</span>&nbsp; <span class='diff-add'> for (var i=0; i<l; i++) {</span>&nbsp; <span class='diff-add'> var payload = payloads[i];</span>&nbsp; <span class='diff-add'> var callback = payload_callbacks[payload.source];</span>&nbsp; <span class='diff-add'> if (callback) {</span>&nbsp; <span class='diff-add'> callback(payload, msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @function _handle_status_message</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype._handle_status_message = function (msg) {</span>&nbsp; <span class='diff-add'> var execution_state = msg.content.execution_state;</span>&nbsp; <span class='diff-add'> var parent_id = msg.parent_header.msg_id;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // dispatch status msg callbacks, if any</span>&nbsp; <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(parent_id);</span>&nbsp; <span class='diff-add'> if (callbacks && callbacks.iopub && callbacks.iopub.status) {</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> callbacks.iopub.status(msg);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> console.log("Exception in status msg handler", e, e.stack);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (execution_state === 'busy') {</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_busy.Kernel', {kernel: this});</span>&nbsp; <span class='diff-add'> } else if (execution_state === 'idle') {</span>&nbsp; <span class='diff-add'> // signal that iopub callbacks are (probably) done</span>&nbsp; <span class='diff-add'> // async output may still arrive,</span>&nbsp; <span class='diff-add'> // but only for the most recent request</span>&nbsp; <span class='diff-add'> this._finish_iopub(parent_id);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // trigger status_idle event</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_idle.Kernel', {kernel: this});</span>&nbsp; <span class='diff-add'> } else if (execution_state === 'starting') {</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_starting.Kernel', {kernel: this});</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.kernel_info(function (reply) {</span>&nbsp; <span class='diff-add'> that.info_reply = reply.content;</span>&nbsp; <span class='diff-add'> that.events.trigger('kernel_ready.Kernel', {kernel: that});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> } else if (execution_state === 'restarting') {</span>&nbsp; <span class='diff-add'> // autorestarting is distinct from restarting,</span>&nbsp; <span class='diff-add'> // in that it means the kernel died and the server is restarting it.</span>&nbsp; <span class='diff-add'> // kernel_restarting sets the notification widget,</span>&nbsp; <span class='diff-add'> // autorestart shows the more prominent dialog.</span>&nbsp; <span class='diff-add'> this._autorestart_attempt = this._autorestart_attempt + 1;</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_restarting.Kernel', {kernel: this});</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_autorestarting.Kernel', {kernel: this, attempt: this._autorestart_attempt});</span>&nbsp; <span class='diff-add'> } else if (execution_state === 'dead') {</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_dead.Kernel', {kernel: this});</span>&nbsp; <span class='diff-add'> this._kernel_dead();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle clear_output message</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _handle_clear_output</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype._handle_clear_output = function (msg) {</span>&nbsp; <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(msg.parent_header.msg_id);</span>&nbsp; <span class='diff-add'> if (!callbacks || !callbacks.iopub) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var callback = callbacks.iopub.clear_output;</span>&nbsp; <span class='diff-add'> if (callback) {</span>&nbsp; <span class='diff-add'> callback(msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * handle an output message (execute_result, display_data, etc.)</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _handle_output_message</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype._handle_output_message = function (msg) {</span>&nbsp; <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(msg.parent_header.msg_id);</span>&nbsp; <span class='diff-add'> if (!callbacks || !callbacks.iopub) {</span>&nbsp; <span class='diff-add'> // The message came from another client. Let the UI decide what to</span>&nbsp; <span class='diff-add'> // do with it.</span>&nbsp; <span class='diff-add'> this.events.trigger('received_unsolicited_message.Kernel', msg);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var callback = callbacks.iopub.output;</span>&nbsp; <span class='diff-add'> if (callback) {</span>&nbsp; <span class='diff-add'> callback(msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle an input message (execute_input).</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _handle_input message</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype._handle_input_message = function (msg) {</span>&nbsp; <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(msg.parent_header.msg_id);</span>&nbsp; <span class='diff-add'> if (!callbacks) {</span>&nbsp; <span class='diff-add'> // The message came from another client. Let the UI decide what to</span>&nbsp; <span class='diff-add'> // do with it.</span>&nbsp; <span class='diff-add'> this.events.trigger('received_unsolicited_message.Kernel', msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Dispatch IOPub messages to respective handlers. Each message</span>&nbsp; <span class='diff-add'> * type should have a handler.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _handle_iopub_message</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype._handle_iopub_message = function (msg) {</span>&nbsp; <span class='diff-add'> var handler = this.get_iopub_handler(msg.header.msg_type);</span>&nbsp; <span class='diff-add'> if (handler !== undefined) {</span>&nbsp; <span class='diff-add'> handler(msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @function _handle_input_request</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Kernel.prototype._handle_input_request = function (request) {</span>&nbsp; <span class='diff-add'> var header = request.header;</span>&nbsp; <span class='diff-add'> var content = request.content;</span>&nbsp; <span class='diff-add'> var metadata = request.metadata;</span>&nbsp; <span class='diff-add'> var msg_type = header.msg_type;</span>&nbsp; <span class='diff-add'> if (msg_type !== 'input_request') {</span>&nbsp; <span class='diff-add'> console.log("Invalid input request!", request);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var callbacks = this.get_callbacks_for_msg(request.parent_header.msg_id);</span>&nbsp; <span class='diff-add'> if (callbacks) {</span>&nbsp; <span class='diff-add'> if (callbacks.input) {</span>&nbsp; <span class='diff-add'> callbacks.input(request);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.Kernel = Kernel;</span>&nbsp; <span class='diff-add'> return {'Kernel': Kernel};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/kernelselector.js b/ipynb/Array-feature-overlap-05_files/kernelselector.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..e25ed2b</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/kernelselector.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'base/js/dialog',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'>], function($, IPython, dialog, utils) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var KernelSelector = function(selector, notebook) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.selector = selector;</span>&nbsp; <span class='diff-add'> this.notebook = notebook;</span>&nbsp; <span class='diff-add'> this.notebook.set_kernelselector(this);</span>&nbsp; <span class='diff-add'> this.events = notebook.events;</span>&nbsp; <span class='diff-add'> this.current_selection = null;</span>&nbsp; <span class='diff-add'> this.kernelspecs = {};</span>&nbsp; <span class='diff-add'> if (this.selector !== undefined) {</span>&nbsp; <span class='diff-add'> this.element = $(selector);</span>&nbsp; <span class='diff-add'> this.request_kernelspecs();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> // Make the object globally available for user convenience & inspection</span>&nbsp; <span class='diff-add'> IPython.kernelselector = this;</span>&nbsp; <span class='diff-add'> this._finish_load = null;</span>&nbsp; <span class='diff-add'> this._loaded = false;</span>&nbsp; <span class='diff-add'> this.loaded = new Promise(function(resolve) {</span>&nbsp; <span class='diff-add'> that._finish_load = resolve;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> Object.seal(this);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> KernelSelector.prototype.request_kernelspecs = function() {</span>&nbsp; <span class='diff-add'> var url = utils.url_join_encode(this.notebook.base_url, 'api/kernelspecs');</span>&nbsp; <span class='diff-add'> utils.promising_ajax(url).then($.proxy(this._got_kernelspecs, this));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var _sorted_names = function(kernelspecs) {</span>&nbsp; <span class='diff-add'> // sort kernel names</span>&nbsp; <span class='diff-add'> return Object.keys(kernelspecs).sort(function (a, b) {</span>&nbsp; <span class='diff-add'> // sort by display_name</span>&nbsp; <span class='diff-add'> var da = kernelspecs[a].spec.display_name;</span>&nbsp; <span class='diff-add'> var db = kernelspecs[b].spec.display_name;</span>&nbsp; <span class='diff-add'> if (da === db) {</span>&nbsp; <span class='diff-add'> return 0;</span>&nbsp; <span class='diff-add'> } else if (da > db) {</span>&nbsp; <span class='diff-add'> return 1;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return -1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> KernelSelector.prototype._got_kernelspecs = function(data) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.kernelspecs = data.kernelspecs;</span>&nbsp; <span class='diff-add'> var change_kernel_submenu = $("#menu-change-kernel-submenu");</span>&nbsp; <span class='diff-add'> var new_notebook_submenu = $("#menu-new-notebook-submenu");</span>&nbsp; <span class='diff-add'> var keys = _sorted_names(data.kernelspecs);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> keys.map(function (key) {</span>&nbsp; <span class='diff-add'> // Create the Kernel > Change kernel submenu</span>&nbsp; <span class='diff-add'> var ks = data.kernelspecs[key];</span>&nbsp; <span class='diff-add'> change_kernel_submenu.append(</span>&nbsp; <span class='diff-add'> $("<li>").attr("id", "kernel-submenu-"+ks.name).append(</span>&nbsp; <span class='diff-add'> $('<a>')</span>&nbsp; <span class='diff-add'> .attr('href', '#')</span>&nbsp; <span class='diff-add'> .click( function () {</span>&nbsp; <span class='diff-add'> that.set_kernel(ks.name);</span>&nbsp; <span class='diff-add'> })</span>&nbsp; <span class='diff-add'> .text(ks.spec.display_name)</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> // Create the File > New Notebook submenu</span>&nbsp; <span class='diff-add'> new_notebook_submenu.append(</span>&nbsp; <span class='diff-add'> $("<li>").attr("id", "new-notebook-submenu-"+ks.name).append(</span>&nbsp; <span class='diff-add'> $('<a>')</span>&nbsp; <span class='diff-add'> .attr('href', '#')</span>&nbsp; <span class='diff-add'> .click( function () {</span>&nbsp; <span class='diff-add'> that.new_notebook(ks.name);</span>&nbsp; <span class='diff-add'> })</span>&nbsp; <span class='diff-add'> .text(ks.spec.display_name)</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // trigger loaded promise</span>&nbsp; <span class='diff-add'> this._loaded = true;</span>&nbsp; <span class='diff-add'> this._finish_load();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> KernelSelector.prototype._spec_changed = function (event, ks) {</span>&nbsp; <span class='diff-add'> /** event handler for spec_changed */</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // update selection</span>&nbsp; <span class='diff-add'> this.current_selection = ks.name;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // put the current kernel at the top of File > New Notebook</span>&nbsp; <span class='diff-add'> var cur_kernel_entry = $("#new-notebook-submenu-" + ks.name);</span>&nbsp; <span class='diff-add'> var parent = cur_kernel_entry.parent();</span>&nbsp; <span class='diff-add'> // do something only if there is more than one kernel</span>&nbsp; <span class='diff-add'> if (parent.children().length > 1) {</span>&nbsp; <span class='diff-add'> // first, sort back the submenu</span>&nbsp; <span class='diff-add'> parent.append(</span>&nbsp; <span class='diff-add'> parent.children("li[class!='divider']").sort(</span>&nbsp; <span class='diff-add'> function (a,b) {</span>&nbsp; <span class='diff-add'> var da = $("a",a).text();</span>&nbsp; <span class='diff-add'> var db = $("a",b).text();</span>&nbsp; <span class='diff-add'> if (da === db) {</span>&nbsp; <span class='diff-add'> return 0;</span>&nbsp; <span class='diff-add'> } else if (da > db) {</span>&nbsp; <span class='diff-add'> return 1;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return -1;</span>&nbsp; <span class='diff-add'> }}));</span>&nbsp; <span class='diff-add'> // then, if there is no divider yet, add one</span>&nbsp; <span class='diff-add'> if (!parent.children("li[class='divider']").length) {</span>&nbsp; <span class='diff-add'> parent.prepend($("<li>").attr("class","divider"));</span>&nbsp; <span class='diff-add'> } </span>&nbsp; <span class='diff-add'> // finally, put the current kernel at the top</span>&nbsp; <span class='diff-add'> parent.prepend(cur_kernel_entry);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // load logo</span>&nbsp; <span class='diff-add'> var logo_img = this.element.find("img.current_kernel_logo");</span>&nbsp; <span class='diff-add'> $("#kernel_indicator").find('.kernel_indicator_name').text(ks.spec.display_name);</span>&nbsp; <span class='diff-add'> if (ks.resources['logo-64x64']) {</span>&nbsp; <span class='diff-add'> logo_img.attr("src", ks.resources['logo-64x64']);</span>&nbsp; <span class='diff-add'> logo_img.show();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> logo_img.hide();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // load kernel css</span>&nbsp; <span class='diff-add'> var css_url = ks.resources['kernel.css'];</span>&nbsp; <span class='diff-add'> if (css_url) {</span>&nbsp; <span class='diff-add'> $('#kernel-css').attr('href', css_url);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> $('#kernel-css').attr('href', '');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // load kernel js</span>&nbsp; <span class='diff-add'> if (ks.resources['kernel.js']) {</span>&nbsp; <span class='diff-add'> require([ks.resources['kernel.js']],</span>&nbsp; <span class='diff-add'> function (kernel_mod) {</span>&nbsp; <span class='diff-add'> if (kernel_mod && kernel_mod.onload) {</span>&nbsp; <span class='diff-add'> kernel_mod.onload();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> console.warn("Kernel " + ks.name + " has a kernel.js file that does not contain "+</span>&nbsp; <span class='diff-add'> "any asynchronous module definition. This is undefined behavior "+</span>&nbsp; <span class='diff-add'> "and not recommended.");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, function (err) {</span>&nbsp; <span class='diff-add'> console.warn("Failed to load kernel.js from ", ks.resources['kernel.js'], err);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KernelSelector.prototype.set_kernel = function (selected) {</span>&nbsp; <span class='diff-add'> /** set the kernel by name, ensuring kernelspecs have been loaded, first </span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> kernel can be just a kernel name, or a notebook kernelspec metadata</span>&nbsp; <span class='diff-add'> (name, language, display_name).</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> if (typeof selected === 'string') {</span>&nbsp; <span class='diff-add'> selected = {</span>&nbsp; <span class='diff-add'> name: selected</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this._loaded) {</span>&nbsp; <span class='diff-add'> this._set_kernel(selected);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return this.loaded.then(function () {</span>&nbsp; <span class='diff-add'> that._set_kernel(selected);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KernelSelector.prototype._set_kernel = function (selected) {</span>&nbsp; <span class='diff-add'> /** Actually set the kernel (kernelspecs have been loaded) */</span>&nbsp; <span class='diff-add'> if (selected.name === this.current_selection) {</span>&nbsp; <span class='diff-add'> // only trigger event if value changed</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var kernelspecs = this.kernelspecs;</span>&nbsp; <span class='diff-add'> var ks = kernelspecs[selected.name];</span>&nbsp; <span class='diff-add'> if (ks === undefined) {</span>&nbsp; <span class='diff-add'> var available = _sorted_names(kernelspecs);</span>&nbsp; <span class='diff-add'> var matches = [];</span>&nbsp; <span class='diff-add'> if (selected.language && selected.language.length > 0) {</span>&nbsp; <span class='diff-add'> available.map(function (name) {</span>&nbsp; <span class='diff-add'> if (kernelspecs[name].spec.language.toLowerCase() === selected.language.toLowerCase()) {</span>&nbsp; <span class='diff-add'> matches.push(name);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (matches.length === 1) {</span>&nbsp; <span class='diff-add'> ks = kernelspecs[matches[0]];</span>&nbsp; <span class='diff-add'> console.log("No exact match found for " + selected.name +</span>&nbsp; <span class='diff-add'> ", using only kernel that matches language=" + selected.language, ks);</span>&nbsp; <span class='diff-add'> this.events.trigger("spec_match_found.Kernel", {</span>&nbsp; <span class='diff-add'> selected: selected,</span>&nbsp; <span class='diff-add'> found: ks,</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // if still undefined, trigger failure event</span>&nbsp; <span class='diff-add'> if (ks === undefined) {</span>&nbsp; <span class='diff-add'> this.events.trigger("spec_not_found.Kernel", {</span>&nbsp; <span class='diff-add'> selected: selected,</span>&nbsp; <span class='diff-add'> matches: matches,</span>&nbsp; <span class='diff-add'> available: available,</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.notebook._session_starting &&</span>&nbsp; <span class='diff-add'> this.notebook.session.kernel.name !== ks.name) {</span>&nbsp; <span class='diff-add'> console.error("Cannot change kernel while waiting for pending session start.");</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.current_selection = ks.name;</span>&nbsp; <span class='diff-add'> this.events.trigger('spec_changed.Kernel', ks);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> KernelSelector.prototype._spec_not_found = function (event, data) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var select = $("<select>").addClass('form-control');</span>&nbsp; <span class='diff-add'> console.warn("Kernelspec not found:", data);</span>&nbsp; <span class='diff-add'> var names;</span>&nbsp; <span class='diff-add'> if (data.matches.length > 1) {</span>&nbsp; <span class='diff-add'> names = data.matches;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> names = data.available;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> names.map(function (name) {</span>&nbsp; <span class='diff-add'> var ks = that.kernelspecs[name];</span>&nbsp; <span class='diff-add'> select.append(</span>&nbsp; <span class='diff-add'> $('<option/>').attr('value', ks.name).text(ks.spec.display_name || ks.name)</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var body = $("<form>").addClass("form-inline").append(</span>&nbsp; <span class='diff-add'> $("<span>").text(</span>&nbsp; <span class='diff-add'> "I couldn't find a kernel matching " + (data.selected.display_name || data.selected.name) + "." +</span>&nbsp; <span class='diff-add'> " Please select a kernel:"</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> ).append(select);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> title : 'Kernel not found',</span>&nbsp; <span class='diff-add'> body : body,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> 'Continue without kernel' : {</span>&nbsp; <span class='diff-add'> class : 'btn-danger',</span>&nbsp; <span class='diff-add'> click : function () {</span>&nbsp; <span class='diff-add'> that.events.trigger('no_kernel.Kernel');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> OK : {</span>&nbsp; <span class='diff-add'> class : 'btn-primary',</span>&nbsp; <span class='diff-add'> click : function () {</span>&nbsp; <span class='diff-add'> that.set_kernel(select.val());</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KernelSelector.prototype.new_notebook = function (kernel_name) {</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var w = window.open(undefined, IPython._target);</span>&nbsp; <span class='diff-add'> // Create a new notebook in the same path as the current</span>&nbsp; <span class='diff-add'> // notebook's path.</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var parent = utils.url_path_split(that.notebook.notebook_path)[0];</span>&nbsp; <span class='diff-add'> that.notebook.contents.new_untitled(parent, {type: "notebook"}).then(</span>&nbsp; <span class='diff-add'> function (data) {</span>&nbsp; <span class='diff-add'> var url = utils.url_join_encode(</span>&nbsp; <span class='diff-add'> that.notebook.base_url, 'notebooks', data.path</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> url += "?kernel_name=" + kernel_name;</span>&nbsp; <span class='diff-add'> w.location = url;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> function(error) {</span>&nbsp; <span class='diff-add'> w.close();</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> title : 'Creating Notebook Failed',</span>&nbsp; <span class='diff-add'> body : "The error was: " + error.message,</span>&nbsp; <span class='diff-add'> buttons : {'OK' : {'class' : 'btn-primary'}}</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KernelSelector.prototype.lock_switch = function() {</span>&nbsp; <span class='diff-add'> // should set a flag and display warning+reload if user want to</span>&nbsp; <span class='diff-add'> // re-change kernel. As UI discussion never finish</span>&nbsp; <span class='diff-add'> // making that a separate PR.</span>&nbsp; <span class='diff-add'> console.warn('switching kernel is not guaranteed to work !');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KernelSelector.prototype.bind_events = function() {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.events.on('spec_changed.Kernel', $.proxy(this._spec_changed, this));</span>&nbsp; <span class='diff-add'> this.events.on('spec_not_found.Kernel', $.proxy(this._spec_not_found, this));</span>&nbsp; <span class='diff-add'> this.events.on('kernel_created.Session', function (event, data) {</span>&nbsp; <span class='diff-add'> that.set_kernel(data.kernel.name);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var logo_img = this.element.find("img.current_kernel_logo");</span>&nbsp; <span class='diff-add'> logo_img.on("load", function() {</span>&nbsp; <span class='diff-add'> logo_img.show();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> logo_img.on("error", function() {</span>&nbsp; <span class='diff-add'> logo_img.hide();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return {'KernelSelector': KernelSelector};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/keyboard.js b/ipynb/Array-feature-overlap-05_files/keyboard.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..474b240</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/keyboard.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @module keyboard</span>&nbsp; <span class='diff-add'> * @namespace keyboard</span>&nbsp; <span class='diff-add'> * @class ShortcutManager</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'underscore',</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils, _) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Setup global keycodes and inverse keycodes.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * See http://unixpapa.com/js/key.html for a complete description. The short of</span>&nbsp; <span class='diff-add'> * it is that there are different keycode sets. Firefox uses the "Mozilla keycodes"</span>&nbsp; <span class='diff-add'> * and Webkit/IE use the "IE keycodes". These keycode sets are mostly the same</span>&nbsp; <span class='diff-add'> * but have minor differences.</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> // These apply to Firefox, (Webkit and IE)</span>&nbsp; <span class='diff-add'> // This does work **only** on US keyboard.</span>&nbsp; <span class='diff-add'> var _keycodes = {</span>&nbsp; <span class='diff-add'> 'a': 65, 'b': 66, 'c': 67, 'd': 68, 'e': 69, 'f': 70, 'g': 71, 'h': 72, 'i': 73,</span>&nbsp; <span class='diff-add'> 'j': 74, 'k': 75, 'l': 76, 'm': 77, 'n': 78, 'o': 79, 'p': 80, 'q': 81, 'r': 82,</span>&nbsp; <span class='diff-add'> 's': 83, 't': 84, 'u': 85, 'v': 86, 'w': 87, 'x': 88, 'y': 89, 'z': 90,</span>&nbsp; <span class='diff-add'> '1 !': 49, '2 @': 50, '3 #': 51, '4 $': 52, '5 %': 53, '6 ^': 54,</span>&nbsp; <span class='diff-add'> '7 &': 55, '8 *': 56, '9 (': 57, '0 )': 48, </span>&nbsp; <span class='diff-add'> '[ {': 219, '] }': 221, '` ~': 192, ', <': 188, '. >': 190, '/ ?': 191,</span>&nbsp; <span class='diff-add'> '\\ |': 220, '\' "': 222,</span>&nbsp; <span class='diff-add'> 'numpad0': 96, 'numpad1': 97, 'numpad2': 98, 'numpad3': 99, 'numpad4': 100,</span>&nbsp; <span class='diff-add'> 'numpad5': 101, 'numpad6': 102, 'numpad7': 103, 'numpad8': 104, 'numpad9': 105,</span>&nbsp; <span class='diff-add'> 'multiply': 106, 'add': 107, 'subtract': 109, 'decimal': 110, 'divide': 111,</span>&nbsp; <span class='diff-add'> 'f1': 112, 'f2': 113, 'f3': 114, 'f4': 115, 'f5': 116, 'f6': 117, 'f7': 118,</span>&nbsp; <span class='diff-add'> 'f8': 119, 'f9': 120, 'f11': 122, 'f12': 123, 'f13': 124, 'f14': 125, 'f15': 126,</span>&nbsp; <span class='diff-add'> 'backspace': 8, 'tab': 9, 'enter': 13, 'shift': 16, 'ctrl': 17, 'alt': 18,</span>&nbsp; <span class='diff-add'> 'meta': 91, 'capslock': 20, 'esc': 27, 'space': 32, 'pageup': 33, 'pagedown': 34,</span>&nbsp; <span class='diff-add'> 'end': 35, 'home': 36, 'left': 37, 'up': 38, 'right': 39, 'down': 40,</span>&nbsp; <span class='diff-add'> 'insert': 45, 'delete': 46, 'numlock': 144,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // These apply to Firefox and Opera</span>&nbsp; <span class='diff-add'> var _mozilla_keycodes = {</span>&nbsp; <span class='diff-add'> '; :': 59, '= +': 61, '- _': 173, 'meta': 224</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // This apply to Webkit and IE</span>&nbsp; <span class='diff-add'> var _ie_keycodes = {</span>&nbsp; <span class='diff-add'> '; :': 186, '= +': 187, '- _': 189</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var browser = utils.browser[0];</span>&nbsp; <span class='diff-add'> var platform = utils.platform;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (browser === 'Firefox' || browser === 'Opera' || browser === 'Netscape') {</span>&nbsp; <span class='diff-add'> $.extend(_keycodes, _mozilla_keycodes);</span>&nbsp; <span class='diff-add'> } else if (browser === 'Safari' || browser === 'Chrome' || browser === 'MSIE') {</span>&nbsp; <span class='diff-add'> $.extend(_keycodes, _ie_keycodes);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var keycodes = {};</span>&nbsp; <span class='diff-add'> var inv_keycodes = {};</span>&nbsp; <span class='diff-add'> for (var name in _keycodes) {</span>&nbsp; <span class='diff-add'> var names = name.split(' ');</span>&nbsp; <span class='diff-add'> if (names.length === 1) {</span>&nbsp; <span class='diff-add'> var n = names[0];</span>&nbsp; <span class='diff-add'> keycodes[n] = _keycodes[n];</span>&nbsp; <span class='diff-add'> inv_keycodes[_keycodes[n]] = n;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var primary = names[0];</span>&nbsp; <span class='diff-add'> var secondary = names[1];</span>&nbsp; <span class='diff-add'> keycodes[primary] = _keycodes[name];</span>&nbsp; <span class='diff-add'> keycodes[secondary] = _keycodes[name];</span>&nbsp; <span class='diff-add'> inv_keycodes[_keycodes[name]] = primary;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var normalize_key = function (key) {</span>&nbsp; <span class='diff-add'> return inv_keycodes[keycodes[key]];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var normalize_shortcut = function (shortcut) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @function _normalize_shortcut</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> * return a dict containing the normalized shortcut and the number of time it should be pressed:</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Put a shortcut into normalized form:</span>&nbsp; <span class='diff-add'> * 1. Make lowercase</span>&nbsp; <span class='diff-add'> * 2. Replace cmd by meta</span>&nbsp; <span class='diff-add'> * 3. Sort '-' separated modifiers into the order alt-ctrl-meta-shift</span>&nbsp; <span class='diff-add'> * 4. Normalize keys</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> if (platform === 'MacOS') {</span>&nbsp; <span class='diff-add'> shortcut = shortcut.toLowerCase().replace('cmdtrl-', 'cmd-');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> shortcut = shortcut.toLowerCase().replace('cmdtrl-', 'ctrl-');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> shortcut = shortcut.toLowerCase().replace('cmd', 'meta');</span>&nbsp; <span class='diff-add'> shortcut = shortcut.replace(/-$/, '_'); // catch shortcuts using '-' key</span>&nbsp; <span class='diff-add'> shortcut = shortcut.replace(/,$/, 'comma'); // catch shortcuts using '-' key</span>&nbsp; <span class='diff-add'> if(shortcut.indexOf(',') !== -1){</span>&nbsp; <span class='diff-add'> var sht = shortcut.split(',');</span>&nbsp; <span class='diff-add'> sht = _.map(sht, normalize_shortcut);</span>&nbsp; <span class='diff-add'> return shortcut;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> shortcut = shortcut.replace(/comma/g, ','); // catch shortcuts using '-' key</span>&nbsp; <span class='diff-add'> var values = shortcut.split("-");</span>&nbsp; <span class='diff-add'> if (values.length === 1) {</span>&nbsp; <span class='diff-add'> return normalize_key(values[0]);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var modifiers = values.slice(0,-1);</span>&nbsp; <span class='diff-add'> var key = normalize_key(values[values.length-1]);</span>&nbsp; <span class='diff-add'> modifiers.sort();</span>&nbsp; <span class='diff-add'> return modifiers.join('-') + '-' + key;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var shortcut_to_event = function (shortcut, type) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Convert a shortcut (shift-r) to a jQuery Event object</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> type = type || 'keydown';</span>&nbsp; <span class='diff-add'> shortcut = normalize_shortcut(shortcut);</span>&nbsp; <span class='diff-add'> shortcut = shortcut.replace(/-$/, '_'); // catch shortcuts using '-' key</span>&nbsp; <span class='diff-add'> var values = shortcut.split("-");</span>&nbsp; <span class='diff-add'> var modifiers = values.slice(0,-1);</span>&nbsp; <span class='diff-add'> var key = values[values.length-1];</span>&nbsp; <span class='diff-add'> var opts = {which: keycodes[key]};</span>&nbsp; <span class='diff-add'> if (modifiers.indexOf('alt') !== -1) {opts.altKey = true;}</span>&nbsp; <span class='diff-add'> if (modifiers.indexOf('ctrl') !== -1) {opts.ctrlKey = true;}</span>&nbsp; <span class='diff-add'> if (modifiers.indexOf('meta') !== -1) {opts.metaKey = true;}</span>&nbsp; <span class='diff-add'> if (modifiers.indexOf('shift') !== -1) {opts.shiftKey = true;}</span>&nbsp; <span class='diff-add'> return $.Event(type, opts);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var only_modifier_event = function(event){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Return `true` if the event only contains modifiers keys.</span>&nbsp; <span class='diff-add'> * false otherwise</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> var key = inv_keycodes[event.which];</span>&nbsp; <span class='diff-add'> return ((event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) && </span>&nbsp; <span class='diff-add'> (key === 'alt'|| key === 'ctrl'|| key === 'meta'|| key === 'shift'));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var event_to_shortcut = function (event) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Convert a jQuery Event object to a normalized shortcut string (shift-r)</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> var shortcut = '';</span>&nbsp; <span class='diff-add'> var key = inv_keycodes[event.which];</span>&nbsp; <span class='diff-add'> if (event.altKey && key !== 'alt') {shortcut += 'alt-';}</span>&nbsp; <span class='diff-add'> if (event.ctrlKey && key !== 'ctrl') {shortcut += 'ctrl-';}</span>&nbsp; <span class='diff-add'> if (event.metaKey && key !== 'meta') {shortcut += 'meta-';}</span>&nbsp; <span class='diff-add'> if (event.shiftKey && key !== 'shift') {shortcut += 'shift-';}</span>&nbsp; <span class='diff-add'> shortcut += key;</span>&nbsp; <span class='diff-add'> return shortcut;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Shortcut manager class</span>&nbsp; <span class='diff-add'> var ShortcutManager = function (delay, events, actions, env) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * A class to deal with keyboard event and shortcut</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @class ShortcutManager</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this._shortcuts = {};</span>&nbsp; <span class='diff-add'> this.delay = delay || 800; // delay in milliseconds</span>&nbsp; <span class='diff-add'> this.events = events;</span>&nbsp; <span class='diff-add'> this.actions = actions;</span>&nbsp; <span class='diff-add'> this.actions.extend_env(env);</span>&nbsp; <span class='diff-add'> this._queue = [];</span>&nbsp; <span class='diff-add'> this._cleartimeout = null;</span>&nbsp; <span class='diff-add'> Object.seal(this);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype.clearsoon = function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Clear the pending shortcut soon, and cancel previous clearing</span>&nbsp; <span class='diff-add'> * that might be registered.</span>&nbsp; <span class='diff-add'> **/ </span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> clearTimeout(this._cleartimeout);</span>&nbsp; <span class='diff-add'> this._cleartimeout = setTimeout(function(){that.clearqueue();}, this.delay);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype.clearqueue = function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * clear the pending shortcut sequence now. </span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> this._queue = [];</span>&nbsp; <span class='diff-add'> clearTimeout(this._cleartimeout);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var flatten_shorttree = function(tree){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Flatten a tree of shortcut sequences. </span>&nbsp; <span class='diff-add'> * use full to iterate over all the key/values of available shortcuts.</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> var dct = {};</span>&nbsp; <span class='diff-add'> for(var key in tree){</span>&nbsp; <span class='diff-add'> var value = tree[key];</span>&nbsp; <span class='diff-add'> if(typeof(value) === 'string'){</span>&nbsp; <span class='diff-add'> dct[key] = value;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var ftree=flatten_shorttree(value);</span>&nbsp; <span class='diff-add'> for(var subkey in ftree){</span>&nbsp; <span class='diff-add'> dct[key+','+subkey] = ftree[subkey];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } </span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return dct;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype.help = function () {</span>&nbsp; <span class='diff-add'> var help = [];</span>&nbsp; <span class='diff-add'> var ftree = flatten_shorttree(this._shortcuts);</span>&nbsp; <span class='diff-add'> for (var shortcut in ftree) {</span>&nbsp; <span class='diff-add'> var action = this.actions.get(ftree[shortcut]);</span>&nbsp; <span class='diff-add'> var help_string = action.help||'== no help ==';</span>&nbsp; <span class='diff-add'> var help_index = action.help_index;</span>&nbsp; <span class='diff-add'> if (help_string) {</span>&nbsp; <span class='diff-add'> var shortstring = (action.shortstring||shortcut);</span>&nbsp; <span class='diff-add'> help.push({</span>&nbsp; <span class='diff-add'> shortcut: shortstring,</span>&nbsp; <span class='diff-add'> help: help_string,</span>&nbsp; <span class='diff-add'> help_index: help_index}</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> help.sort(function (a, b) {</span>&nbsp; <span class='diff-add'> if (a.help_index > b.help_index){</span>&nbsp; <span class='diff-add'> return 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (a.help_index < b.help_index){</span>&nbsp; <span class='diff-add'> return -1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return 0;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return help;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype.clear_shortcuts = function () {</span>&nbsp; <span class='diff-add'> this._shortcuts = {};</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype.get_shortcut = function (shortcut){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * return a node of the shortcut tree which an action name (string) if leaf,</span>&nbsp; <span class='diff-add'> * and an object with `object.subtree===true`</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> if(typeof(shortcut) === 'string'){</span>&nbsp; <span class='diff-add'> shortcut = shortcut.split(',');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> return this._get_leaf(shortcut, this._shortcuts);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype._get_leaf = function(shortcut_array, tree){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> * find a leaf/node in a subtree of the keyboard shortcut</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> if(shortcut_array.length === 1){</span>&nbsp; <span class='diff-add'> return tree[shortcut_array[0]];</span>&nbsp; <span class='diff-add'> } else if( typeof(tree[shortcut_array[0]]) !== 'string'){</span>&nbsp; <span class='diff-add'> return this._get_leaf(shortcut_array.slice(1), tree[shortcut_array[0]]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype.set_shortcut = function( shortcut, action_name){</span>&nbsp; <span class='diff-add'> if( typeof(action_name) !== 'string'){ throw('action is not a string', action_name);}</span>&nbsp; <span class='diff-add'> if( typeof(shortcut) === 'string'){</span>&nbsp; <span class='diff-add'> shortcut = shortcut.split(',');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this._set_leaf(shortcut, action_name, this._shortcuts);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype._is_leaf = function(shortcut_array, tree){</span>&nbsp; <span class='diff-add'> if(shortcut_array.length === 1){</span>&nbsp; <span class='diff-add'> return(typeof(tree[shortcut_array[0]]) === 'string');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var subtree = tree[shortcut_array[0]];</span>&nbsp; <span class='diff-add'> return this._is_leaf(shortcut_array.slice(1), subtree );</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype._remove_leaf = function(shortcut_array, tree, allow_node){</span>&nbsp; <span class='diff-add'> if(shortcut_array.length === 1){</span>&nbsp; <span class='diff-add'> var current_node = tree[shortcut_array[0]];</span>&nbsp; <span class='diff-add'> if(typeof(current_node) === 'string'){</span>&nbsp; <span class='diff-add'> delete tree[shortcut_array[0]];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> throw('try to delete non-leaf');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this._remove_leaf(shortcut_array.slice(1), tree[shortcut_array[0]], allow_node);</span>&nbsp; <span class='diff-add'> if(_.keys(tree[shortcut_array[0]]).length === 0){</span>&nbsp; <span class='diff-add'> delete tree[shortcut_array[0]];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype._set_leaf = function(shortcut_array, action_name, tree){</span>&nbsp; <span class='diff-add'> var current_node = tree[shortcut_array[0]];</span>&nbsp; <span class='diff-add'> if(shortcut_array.length === 1){</span>&nbsp; <span class='diff-add'> if(current_node !== undefined && typeof(current_node) !== 'string'){</span>&nbsp; <span class='diff-add'> console.warn('[warning], you are overriting a long shortcut with a shorter one');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> tree[shortcut_array[0]] = action_name;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> if(typeof(current_node) === 'string'){</span>&nbsp; <span class='diff-add'> console.warn('you are trying to set a shortcut that will be shadowed'+</span>&nbsp; <span class='diff-add'> 'by a more specific one. Aborting for :', action_name, 'the follwing '+</span>&nbsp; <span class='diff-add'> 'will take precedence', current_node);</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> tree[shortcut_array[0]] = tree[shortcut_array[0]]||{};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._set_leaf(shortcut_array.slice(1), action_name, tree[shortcut_array[0]]);</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype.add_shortcut = function (shortcut, data, suppress_help_update) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Add a action to be handled by shortcut manager. </span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * - `shortcut` should be a `Shortcut Sequence` of the for `Ctrl-Alt-C,Meta-X`...</span>&nbsp; <span class='diff-add'> * - `data` could be an `action name`, an `action` or a `function`.</span>&nbsp; <span class='diff-add'> * if a `function` is passed it will be converted to an anonymous `action`. </span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> var action_name = this.actions.get_name(data);</span>&nbsp; <span class='diff-add'> if (! action_name){</span>&nbsp; <span class='diff-add'> throw('does nto know how to deal with ', data);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> shortcut = normalize_shortcut(shortcut);</span>&nbsp; <span class='diff-add'> this.set_shortcut(shortcut, action_name);</span>&nbsp; <span class='diff-add'> if (!suppress_help_update) {</span>&nbsp; <span class='diff-add'> // update the keyboard shortcuts notebook help</span>&nbsp; <span class='diff-add'> this.events.trigger('rebuild.QuickHelp');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype.add_shortcuts = function (data) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Convenient methods to call `add_shortcut(key, value)` on several items</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * data : Dict of the form {key:value, ...}</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> for (var shortcut in data) {</span>&nbsp; <span class='diff-add'> this.add_shortcut(shortcut, data[shortcut], true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // update the keyboard shortcuts notebook help</span>&nbsp; <span class='diff-add'> this.events.trigger('rebuild.QuickHelp');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype.remove_shortcut = function (shortcut, suppress_help_update) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Remove the binding of shortcut `sortcut` with its action.</span>&nbsp; <span class='diff-add'> * throw an error if trying to remove a non-exiting shortcut</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> shortcut = normalize_shortcut(shortcut);</span>&nbsp; <span class='diff-add'> if( typeof(shortcut) === 'string'){</span>&nbsp; <span class='diff-add'> shortcut = shortcut.split(',');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._remove_leaf(shortcut, this._shortcuts);</span>&nbsp; <span class='diff-add'> if (!suppress_help_update) {</span>&nbsp; <span class='diff-add'> // update the keyboard shortcuts notebook help</span>&nbsp; <span class='diff-add'> this.events.trigger('rebuild.QuickHelp');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype.call_handler = function (event) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Call the corresponding shortcut handler for a keyboard event</span>&nbsp; <span class='diff-add'> * @method call_handler</span>&nbsp; <span class='diff-add'> * @return {Boolean} `true|false`, `false` if no handler was found, otherwise the value return by the handler. </span>&nbsp; <span class='diff-add'> * @param event {event}</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * given an event, call the corresponding shortcut. </span>&nbsp; <span class='diff-add'> * return false is event wan handled, true otherwise </span>&nbsp; <span class='diff-add'> * in any case returning false stop event propagation</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> this.clearsoon();</span>&nbsp; <span class='diff-add'> if(only_modifier_event(event)){</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var shortcut = event_to_shortcut(event);</span>&nbsp; <span class='diff-add'> this._queue.push(shortcut);</span>&nbsp; <span class='diff-add'> var action_name = this.get_shortcut(this._queue);</span>&nbsp; <span class='diff-add'> if (typeof(action_name) === 'undefined'|| action_name === null){</span>&nbsp; <span class='diff-add'> this.clearqueue();</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (this.actions.exists(action_name)) {</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> this.clearqueue();</span>&nbsp; <span class='diff-add'> return this.actions.call(action_name, event);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ShortcutManager.prototype.handles = function (event) {</span>&nbsp; <span class='diff-add'> var shortcut = event_to_shortcut(event);</span>&nbsp; <span class='diff-add'> var action_name = this.get_shortcut(this._queue.concat(shortcut));</span>&nbsp; <span class='diff-add'> return (typeof(action_name) !== 'undefined');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var keyboard = {</span>&nbsp; <span class='diff-add'> keycodes : keycodes,</span>&nbsp; <span class='diff-add'> inv_keycodes : inv_keycodes,</span>&nbsp; <span class='diff-add'> ShortcutManager : ShortcutManager,</span>&nbsp; <span class='diff-add'> normalize_key : normalize_key,</span>&nbsp; <span class='diff-add'> normalize_shortcut : normalize_shortcut,</span>&nbsp; <span class='diff-add'> shortcut_to_event : shortcut_to_event,</span>&nbsp; <span class='diff-add'> event_to_shortcut : event_to_shortcut,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // For backwards compatibility.</span>&nbsp; <span class='diff-add'> IPython.keyboard = keyboard;</span>&nbsp; <span class='diff-add'> return keyboard;</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/keyboardmanager.js b/ipynb/Array-feature-overlap-05_files/keyboardmanager.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..82d3d36</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/keyboardmanager.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @module keyboardmanager</span>&nbsp; <span class='diff-add'> * @namespace keyboardmanager</span>&nbsp; <span class='diff-add'> * @class KeyboardManager</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'base/js/keyboard',</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils, keyboard) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Main keyboard manager for the notebook</span>&nbsp; <span class='diff-add'> var keycodes = keyboard.keycodes;</span>&nbsp; <span class='diff-add'> var KeyboardManager = function (options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * A class to deal with keyboard event and shortcut</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @class KeyboardManager</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param options {dict} Dictionary of keyword arguments :</span>&nbsp; <span class='diff-add'> * @param options.events {$(Events)} instance </span>&nbsp; <span class='diff-add'> * @param options.pager: {Pager} pager instance</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.mode = 'command';</span>&nbsp; <span class='diff-add'> this.enabled = true;</span>&nbsp; <span class='diff-add'> this.pager = options.pager;</span>&nbsp; <span class='diff-add'> this.quick_help = undefined;</span>&nbsp; <span class='diff-add'> this.notebook = undefined;</span>&nbsp; <span class='diff-add'> this.last_mode = undefined;</span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> this.env = {pager:this.pager};</span>&nbsp; <span class='diff-add'> this.actions = options.actions;</span>&nbsp; <span class='diff-add'> this.command_shortcuts = new keyboard.ShortcutManager(undefined, options.events, this.actions, this.env );</span>&nbsp; <span class='diff-add'> this.command_shortcuts.add_shortcuts(this.get_default_common_shortcuts());</span>&nbsp; <span class='diff-add'> this.command_shortcuts.add_shortcuts(this.get_default_command_shortcuts());</span>&nbsp; <span class='diff-add'> this.edit_shortcuts = new keyboard.ShortcutManager(undefined, options.events, this.actions, this.env);</span>&nbsp; <span class='diff-add'> this.edit_shortcuts.add_shortcuts(this.get_default_common_shortcuts());</span>&nbsp; <span class='diff-add'> this.edit_shortcuts.add_shortcuts(this.get_default_edit_shortcuts());</span>&nbsp; <span class='diff-add'> Object.seal(this);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Return a dict of common shortcut</span>&nbsp; <span class='diff-add'> * @method get_default_common_shortcuts</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @example Example of returned shortcut</span>&nbsp; <span class='diff-add'> * ```</span>&nbsp; <span class='diff-add'> * 'shortcut-key': 'action-name'</span>&nbsp; <span class='diff-add'> * // a string representing the shortcut as dash separated value.</span>&nbsp; <span class='diff-add'> * // e.g. 'shift' , 'shift-enter', 'cmd-t'</span>&nbsp; <span class='diff-add'> *```</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.get_default_common_shortcuts = function() {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'shift' : 'ipython.ignore',</span>&nbsp; <span class='diff-add'> 'shift-enter' : 'ipython.run-select-next',</span>&nbsp; <span class='diff-add'> 'ctrl-enter' : 'ipython.execute-in-place',</span>&nbsp; <span class='diff-add'> 'alt-enter' : 'ipython.execute-and-insert-after',</span>&nbsp; <span class='diff-add'> // cmd on mac, ctrl otherwise</span>&nbsp; <span class='diff-add'> 'cmdtrl-s' : 'ipython.save-notebook',</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.get_default_edit_shortcuts = function() {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'esc' : 'ipython.go-to-command-mode',</span>&nbsp; <span class='diff-add'> 'ctrl-m' : 'ipython.go-to-command-mode',</span>&nbsp; <span class='diff-add'> 'up' : 'ipython.move-cursor-up-or-previous-cell',</span>&nbsp; <span class='diff-add'> 'down' : 'ipython.move-cursor-down-or-next-cell',</span>&nbsp; <span class='diff-add'> 'ctrl-shift--' : 'ipython.split-cell-at-cursor',</span>&nbsp; <span class='diff-add'> 'ctrl-shift-subtract' : 'ipython.split-cell-at-cursor'</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.get_default_command_shortcuts = function() {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'shift-space': 'ipython.scroll-up',</span>&nbsp; <span class='diff-add'> 'shift-v' : 'ipython.paste-cell-before',</span>&nbsp; <span class='diff-add'> 'shift-m' : 'ipython.merge-selected-cell-with-cell-after',</span>&nbsp; <span class='diff-add'> 'shift-o' : 'ipython.toggle-output-scrolling-selected-cell',</span>&nbsp; <span class='diff-add'> 'enter' : 'ipython.enter-edit-mode',</span>&nbsp; <span class='diff-add'> 'space' : 'ipython.scroll-down',</span>&nbsp; <span class='diff-add'> 'down' : 'ipython.select-next-cell',</span>&nbsp; <span class='diff-add'> 'i,i' : 'ipython.interrupt-kernel',</span>&nbsp; <span class='diff-add'> '0,0' : 'ipython.restart-kernel',</span>&nbsp; <span class='diff-add'> 'd,d' : 'ipython.delete-cell',</span>&nbsp; <span class='diff-add'> 'esc': 'ipython.close-pager',</span>&nbsp; <span class='diff-add'> 'up' : 'ipython.select-previous-cell',</span>&nbsp; <span class='diff-add'> 'k' : 'ipython.select-previous-cell',</span>&nbsp; <span class='diff-add'> 'j' : 'ipython.select-next-cell',</span>&nbsp; <span class='diff-add'> 'x' : 'ipython.cut-selected-cell',</span>&nbsp; <span class='diff-add'> 'c' : 'ipython.copy-selected-cell',</span>&nbsp; <span class='diff-add'> 'v' : 'ipython.paste-cell-after',</span>&nbsp; <span class='diff-add'> 'a' : 'ipython.insert-cell-before',</span>&nbsp; <span class='diff-add'> 'b' : 'ipython.insert-cell-after',</span>&nbsp; <span class='diff-add'> 'y' : 'ipython.change-selected-cell-to-code-cell',</span>&nbsp; <span class='diff-add'> 'm' : 'ipython.change-selected-cell-to-markdown-cell',</span>&nbsp; <span class='diff-add'> 'r' : 'ipython.change-selected-cell-to-raw-cell',</span>&nbsp; <span class='diff-add'> '1' : 'ipython.change-selected-cell-to-heading-1',</span>&nbsp; <span class='diff-add'> '2' : 'ipython.change-selected-cell-to-heading-2',</span>&nbsp; <span class='diff-add'> '3' : 'ipython.change-selected-cell-to-heading-3',</span>&nbsp; <span class='diff-add'> '4' : 'ipython.change-selected-cell-to-heading-4',</span>&nbsp; <span class='diff-add'> '5' : 'ipython.change-selected-cell-to-heading-5',</span>&nbsp; <span class='diff-add'> '6' : 'ipython.change-selected-cell-to-heading-6',</span>&nbsp; <span class='diff-add'> 'o' : 'ipython.toggle-output-visibility-selected-cell',</span>&nbsp; <span class='diff-add'> 's' : 'ipython.save-notebook',</span>&nbsp; <span class='diff-add'> 'l' : 'ipython.toggle-line-number-selected-cell',</span>&nbsp; <span class='diff-add'> 'h' : 'ipython.show-keyboard-shortcut-help-dialog',</span>&nbsp; <span class='diff-add'> 'z' : 'ipython.undo-last-cell-deletion',</span>&nbsp; <span class='diff-add'> 'q' : 'ipython.close-pager',</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> $(document).keydown(function (event) {</span>&nbsp; <span class='diff-add'> if(event._ipkmIgnore===true||(event.originalEvent||{})._ipkmIgnore===true){</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return that.handle_keydown(event);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.set_notebook = function (notebook) {</span>&nbsp; <span class='diff-add'> this.notebook = notebook;</span>&nbsp; <span class='diff-add'> this.actions.extend_env({notebook:notebook});</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.set_quickhelp = function (notebook) {</span>&nbsp; <span class='diff-add'> this.actions.extend_env({quick_help:notebook});</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.handle_keydown = function (event) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * returning false from this will stop event propagation</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> if (event.which === keycodes.esc) {</span>&nbsp; <span class='diff-add'> // Intercept escape at highest level to avoid closing</span>&nbsp; <span class='diff-add'> // websocket connection with firefox</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (!this.enabled) {</span>&nbsp; <span class='diff-add'> if (event.which === keycodes.esc) {</span>&nbsp; <span class='diff-add'> this.notebook.command_mode();</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (this.mode === 'edit') {</span>&nbsp; <span class='diff-add'> return this.edit_shortcuts.call_handler(event);</span>&nbsp; <span class='diff-add'> } else if (this.mode === 'command') {</span>&nbsp; <span class='diff-add'> return this.command_shortcuts.call_handler(event);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.edit_mode = function () {</span>&nbsp; <span class='diff-add'> this.last_mode = this.mode;</span>&nbsp; <span class='diff-add'> this.mode = 'edit';</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.command_mode = function () {</span>&nbsp; <span class='diff-add'> this.last_mode = this.mode;</span>&nbsp; <span class='diff-add'> this.mode = 'command';</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.enable = function () {</span>&nbsp; <span class='diff-add'> this.enabled = true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.disable = function () {</span>&nbsp; <span class='diff-add'> this.enabled = false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> KeyboardManager.prototype.register_events = function (e) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var handle_focus = function () {</span>&nbsp; <span class='diff-add'> that.disable();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var handle_blur = function () {</span>&nbsp; <span class='diff-add'> that.enable();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> e.on('focusin', handle_focus);</span>&nbsp; <span class='diff-add'> e.on('focusout', handle_blur);</span>&nbsp; <span class='diff-add'> // TODO: Very strange. The focusout event does not seem fire for the </span>&nbsp; <span class='diff-add'> // bootstrap textboxes on FF25&26... This works around that by </span>&nbsp; <span class='diff-add'> // registering focus and blur events recursively on all inputs within</span>&nbsp; <span class='diff-add'> // registered element.</span>&nbsp; <span class='diff-add'> e.find('input').blur(handle_blur);</span>&nbsp; <span class='diff-add'> e.on('DOMNodeInserted', function (event) {</span>&nbsp; <span class='diff-add'> var target = $(event.target);</span>&nbsp; <span class='diff-add'> if (target.is('input')) {</span>&nbsp; <span class='diff-add'> target.blur(handle_blur);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> target.find('input').blur(handle_blur); </span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // There are times (raw_input) where we remove the element from the DOM before</span>&nbsp; <span class='diff-add'> // focusout is called. In this case we bind to the remove event of jQueryUI,</span>&nbsp; <span class='diff-add'> // which gets triggered upon removal, iff it is focused at the time.</span>&nbsp; <span class='diff-add'> // is_focused must be used to check for the case where an element within</span>&nbsp; <span class='diff-add'> // the element being removed is focused.</span>&nbsp; <span class='diff-add'> e.on('remove', function () {</span>&nbsp; <span class='diff-add'> if (utils.is_focused(e[0])) {</span>&nbsp; <span class='diff-add'> that.enable();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // For backwards compatibility.</span>&nbsp; <span class='diff-add'> IPython.KeyboardManager = KeyboardManager;</span>&nbsp; <span class='diff-add'> return {'KeyboardManager': KeyboardManager};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/loginwidget.js b/ipynb/Array-feature-overlap-05_files/loginwidget.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..857caf1</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/loginwidget.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'>], function(IPython, utils, $){</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var LoginWidget = function (selector, options) {</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> this.base_url = options.base_url || utils.get_body_data("baseUrl");</span>&nbsp; <span class='diff-add'> this.selector = selector;</span>&nbsp; <span class='diff-add'> if (this.selector !== undefined) {</span>&nbsp; <span class='diff-add'> this.element = $(selector);</span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> LoginWidget.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.element.find("button#logout").click(function () {</span>&nbsp; <span class='diff-add'> window.location = utils.url_join_encode(</span>&nbsp; <span class='diff-add'> that.base_url,</span>&nbsp; <span class='diff-add'> "logout"</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find("button#login").click(function () {</span>&nbsp; <span class='diff-add'> window.location = utils.url_join_encode(</span>&nbsp; <span class='diff-add'> that.base_url,</span>&nbsp; <span class='diff-add'> "login"</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Set module variables</span>&nbsp; <span class='diff-add'> IPython.LoginWidget = LoginWidget;</span>&nbsp; <span class='diff-add'> return {'LoginWidget': LoginWidget};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/logo-64x64.png b/ipynb/Array-feature-overlap-05_files/logo-64x64.png</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..eebbff6</span>&nbsp; Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/logo-64x64.png differ <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/logo.png b/ipynb/Array-feature-overlap-05_files/logo.png</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..54cc416</span>&nbsp; Binary files /dev/null and b/ipynb/Array-feature-overlap-05_files/logo.png differ <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/main.js b/ipynb/Array-feature-overlap-05_files/main.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..31df711</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/main.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>require([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'notebook/js/notebook',</span>&nbsp; <span class='diff-add'> 'contents',</span>&nbsp; <span class='diff-add'> 'services/config',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'base/js/page',</span>&nbsp; <span class='diff-add'> 'base/js/events',</span>&nbsp; <span class='diff-add'> 'auth/js/loginwidget',</span>&nbsp; <span class='diff-add'> 'notebook/js/maintoolbar',</span>&nbsp; <span class='diff-add'> 'notebook/js/pager',</span>&nbsp; <span class='diff-add'> 'notebook/js/quickhelp',</span>&nbsp; <span class='diff-add'> 'notebook/js/menubar',</span>&nbsp; <span class='diff-add'> 'notebook/js/notificationarea',</span>&nbsp; <span class='diff-add'> 'notebook/js/savewidget',</span>&nbsp; <span class='diff-add'> 'notebook/js/actions',</span>&nbsp; <span class='diff-add'> 'notebook/js/keyboardmanager',</span>&nbsp; <span class='diff-add'> 'notebook/js/kernelselector',</span>&nbsp; <span class='diff-add'> 'codemirror/lib/codemirror',</span>&nbsp; <span class='diff-add'> 'notebook/js/about',</span>&nbsp; <span class='diff-add'> // only loaded, not used, please keep sure this is loaded last</span>&nbsp; <span class='diff-add'> 'custom/custom'</span>&nbsp; <span class='diff-add'>], function(</span>&nbsp; <span class='diff-add'> IPython, </span>&nbsp; <span class='diff-add'> $,</span>&nbsp; <span class='diff-add'> notebook, </span>&nbsp; <span class='diff-add'> contents,</span>&nbsp; <span class='diff-add'> configmod,</span>&nbsp; <span class='diff-add'> utils, </span>&nbsp; <span class='diff-add'> page, </span>&nbsp; <span class='diff-add'> events,</span>&nbsp; <span class='diff-add'> loginwidget, </span>&nbsp; <span class='diff-add'> maintoolbar, </span>&nbsp; <span class='diff-add'> pager, </span>&nbsp; <span class='diff-add'> quickhelp, </span>&nbsp; <span class='diff-add'> menubar, </span>&nbsp; <span class='diff-add'> notificationarea, </span>&nbsp; <span class='diff-add'> savewidget,</span>&nbsp; <span class='diff-add'> actions,</span>&nbsp; <span class='diff-add'> keyboardmanager,</span>&nbsp; <span class='diff-add'> kernelselector,</span>&nbsp; <span class='diff-add'> CodeMirror,</span>&nbsp; <span class='diff-add'> about,</span>&nbsp; <span class='diff-add'> // please keep sure that even if not used, this is loaded last</span>&nbsp; <span class='diff-add'> custom</span>&nbsp; <span class='diff-add'> ) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> // compat with old IPython, remove for IPython > 3.0</span>&nbsp; <span class='diff-add'> window.CodeMirror = CodeMirror;</span>&nbsp; <span class='diff-add'> var common_options = {</span>&nbsp; <span class='diff-add'> ws_url : utils.get_body_data("wsUrl"),</span>&nbsp; <span class='diff-add'> base_url : utils.get_body_data("baseUrl"),</span>&nbsp; <span class='diff-add'> notebook_path : utils.get_body_data("notebookPath"),</span>&nbsp; <span class='diff-add'> notebook_name : utils.get_body_data('notebookName')</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var config_section = new configmod.ConfigSection('notebook', common_options);</span>&nbsp; <span class='diff-add'> config_section.load();</span>&nbsp; <span class='diff-add'> var common_config = new configmod.ConfigSection('common', common_options);</span>&nbsp; <span class='diff-add'> common_config.load();</span>&nbsp; <span class='diff-add'> var page = new page.Page();</span>&nbsp; <span class='diff-add'> var pager = new pager.Pager('div#pager', {</span>&nbsp; <span class='diff-add'> events: events});</span>&nbsp; <span class='diff-add'> var acts = new actions.init();</span>&nbsp; <span class='diff-add'> var keyboard_manager = new keyboardmanager.KeyboardManager({</span>&nbsp; <span class='diff-add'> pager: pager, </span>&nbsp; <span class='diff-add'> events: events, </span>&nbsp; <span class='diff-add'> actions: acts });</span>&nbsp; <span class='diff-add'> var save_widget = new savewidget.SaveWidget('span#save_widget', {</span>&nbsp; <span class='diff-add'> events: events, </span>&nbsp; <span class='diff-add'> keyboard_manager: keyboard_manager});</span>&nbsp; <span class='diff-add'> var contents = new contents.Contents({</span>&nbsp; <span class='diff-add'> base_url: common_options.base_url,</span>&nbsp; <span class='diff-add'> common_config: common_config</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var notebook = new notebook.Notebook('div#notebook', $.extend({</span>&nbsp; <span class='diff-add'> events: events,</span>&nbsp; <span class='diff-add'> keyboard_manager: keyboard_manager,</span>&nbsp; <span class='diff-add'> save_widget: save_widget,</span>&nbsp; <span class='diff-add'> contents: contents,</span>&nbsp; <span class='diff-add'> config: config_section},</span>&nbsp; <span class='diff-add'> common_options));</span>&nbsp; <span class='diff-add'> var login_widget = new loginwidget.LoginWidget('span#login_widget', common_options);</span>&nbsp; <span class='diff-add'> var toolbar = new maintoolbar.MainToolBar('#maintoolbar-container', {</span>&nbsp; <span class='diff-add'> notebook: notebook, </span>&nbsp; <span class='diff-add'> events: events, </span>&nbsp; <span class='diff-add'> actions: acts}); </span>&nbsp; <span class='diff-add'> var quick_help = new quickhelp.QuickHelp({</span>&nbsp; <span class='diff-add'> keyboard_manager: keyboard_manager, </span>&nbsp; <span class='diff-add'> events: events,</span>&nbsp; <span class='diff-add'> notebook: notebook});</span>&nbsp; <span class='diff-add'> keyboard_manager.set_notebook(notebook);</span>&nbsp; <span class='diff-add'> keyboard_manager.set_quickhelp(quick_help);</span>&nbsp; <span class='diff-add'> var menubar = new menubar.MenuBar('#menubar', $.extend({</span>&nbsp; <span class='diff-add'> notebook: notebook, </span>&nbsp; <span class='diff-add'> contents: contents,</span>&nbsp; <span class='diff-add'> events: events, </span>&nbsp; <span class='diff-add'> save_widget: save_widget, </span>&nbsp; <span class='diff-add'> quick_help: quick_help}, </span>&nbsp; <span class='diff-add'> common_options));</span>&nbsp; <span class='diff-add'> var notification_area = new notificationarea.NotebookNotificationArea(</span>&nbsp; <span class='diff-add'> '#notification_area', {</span>&nbsp; <span class='diff-add'> events: events, </span>&nbsp; <span class='diff-add'> save_widget: save_widget, </span>&nbsp; <span class='diff-add'> notebook: notebook,</span>&nbsp; <span class='diff-add'> keyboard_manager: keyboard_manager});</span>&nbsp; <span class='diff-add'> notification_area.init_notification_widgets();</span>&nbsp; <span class='diff-add'> var kernel_selector = new kernelselector.KernelSelector(</span>&nbsp; <span class='diff-add'> '#kernel_logo_widget', notebook);</span>&nbsp; <span class='diff-add'> $('body').append('<div id="fonttest"><pre><span id="test1">x</span>'+</span>&nbsp; <span class='diff-add'> '<span id="test2" style="font-weight: bold;">x</span>'+</span>&nbsp; <span class='diff-add'> '<span id="test3" style="font-style: italic;">x</span></pre></div>');</span>&nbsp; <span class='diff-add'> var nh = $('#test1').innerHeight();</span>&nbsp; <span class='diff-add'> var bh = $('#test2').innerHeight();</span>&nbsp; <span class='diff-add'> var ih = $('#test3').innerHeight();</span>&nbsp; <span class='diff-add'> if(nh != bh || nh != ih) {</span>&nbsp; <span class='diff-add'> $('head').append('<style>.CodeMirror span { vertical-align: bottom; }</style>');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> $('#fonttest').remove();</span>&nbsp; <span class='diff-add'> page.show();</span>&nbsp; <span class='diff-add'> var first_load = function () {</span>&nbsp; <span class='diff-add'> var hash = document.location.hash;</span>&nbsp; <span class='diff-add'> if (hash) {</span>&nbsp; <span class='diff-add'> document.location.hash = '';</span>&nbsp; <span class='diff-add'> document.location.hash = hash;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> notebook.set_autosave_interval(notebook.minimum_autosave_interval);</span>&nbsp; <span class='diff-add'> // only do this once</span>&nbsp; <span class='diff-add'> events.off('notebook_loaded.Notebook', first_load);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> events.on('notebook_loaded.Notebook', first_load);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> IPython.page = page;</span>&nbsp; <span class='diff-add'> IPython.notebook = notebook;</span>&nbsp; <span class='diff-add'> IPython.contents = contents;</span>&nbsp; <span class='diff-add'> IPython.pager = pager;</span>&nbsp; <span class='diff-add'> IPython.quick_help = quick_help;</span>&nbsp; <span class='diff-add'> IPython.login_widget = login_widget;</span>&nbsp; <span class='diff-add'> IPython.menubar = menubar;</span>&nbsp; <span class='diff-add'> IPython.toolbar = toolbar;</span>&nbsp; <span class='diff-add'> IPython.notification_area = notification_area;</span>&nbsp; <span class='diff-add'> IPython.keyboard_manager = keyboard_manager;</span>&nbsp; <span class='diff-add'> IPython.save_widget = save_widget;</span>&nbsp; <span class='diff-add'> IPython.tooltip = notebook.tooltip;</span>&nbsp; <span class='diff-add'> events.trigger('app_initialized.NotebookApp');</span>&nbsp; <span class='diff-add'> utils.load_extensions_from_config(config_section);</span>&nbsp; <span class='diff-add'> utils.load_extensions_from_config(common_config);</span>&nbsp; <span class='diff-add'> notebook.load_notebook(common_options.notebook_path);</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/maintoolbar.js b/ipynb/Array-feature-overlap-05_files/maintoolbar.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..cced88c</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/maintoolbar.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'require',</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> './toolbar',</span>&nbsp; <span class='diff-add'> './celltoolbar'</span>&nbsp; <span class='diff-add'>], function(require, IPython, $, toolbar, celltoolbar) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var MainToolBar = function (selector, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters:</span>&nbsp; <span class='diff-add'> * selector: string</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> * events: $(Events) instance</span>&nbsp; <span class='diff-add'> * notebook: Notebook instance</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> toolbar.ToolBar.apply(this, [selector, options] );</span>&nbsp; <span class='diff-add'> this.events = options.events;</span>&nbsp; <span class='diff-add'> this.notebook = options.notebook;</span>&nbsp; <span class='diff-add'> this._make();</span>&nbsp; <span class='diff-add'> this.notebook.keyboard_manager.register_events(this.element);</span>&nbsp; <span class='diff-add'> Object.seal(this);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> MainToolBar.prototype = Object.create(toolbar.ToolBar.prototype);</span>&nbsp; <span class='diff-add'> MainToolBar.prototype._make = function () {</span>&nbsp; <span class='diff-add'> var grps = [</span>&nbsp; <span class='diff-add'> [</span>&nbsp; <span class='diff-add'> ['ipython.save-notebook'],</span>&nbsp; <span class='diff-add'> 'save-notbook'</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> [</span>&nbsp; <span class='diff-add'> ['ipython.insert-cell-after'],</span>&nbsp; <span class='diff-add'> 'insert_above_below'],</span>&nbsp; <span class='diff-add'> [</span>&nbsp; <span class='diff-add'> ['ipython.cut-selected-cell',</span>&nbsp; <span class='diff-add'> 'ipython.copy-selected-cell',</span>&nbsp; <span class='diff-add'> 'ipython.paste-cell-after'</span>&nbsp; <span class='diff-add'> ] ,</span>&nbsp; <span class='diff-add'> 'cut_copy_paste'],</span>&nbsp; <span class='diff-add'> [</span>&nbsp; <span class='diff-add'> ['ipython.move-selected-cell-up',</span>&nbsp; <span class='diff-add'> 'ipython.move-selected-cell-down'</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> 'move_up_down'],</span>&nbsp; <span class='diff-add'> [ ['ipython.run-select-next',</span>&nbsp; <span class='diff-add'> 'ipython.interrupt-kernel',</span>&nbsp; <span class='diff-add'> 'ipython.restart-kernel'</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> 'run_int'],</span>&nbsp; <span class='diff-add'> ['<add_celltype_list>'],</span>&nbsp; <span class='diff-add'> ['<add_celltoolbar_list>']</span>&nbsp; <span class='diff-add'> ];</span>&nbsp; <span class='diff-add'> this.construct(grps);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // add a cell type drop down to the maintoolbar.</span>&nbsp; <span class='diff-add'> // triggered when the pseudo action `<add_celltype_list>` is</span>&nbsp; <span class='diff-add'> // encountered when building a toolbar.</span>&nbsp; <span class='diff-add'> MainToolBar.prototype._pseudo_actions.add_celltype_list = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var sel = $('<select/>')</span>&nbsp; <span class='diff-add'> .attr('id','cell_type')</span>&nbsp; <span class='diff-add'> .addClass('form-control select-xs')</span>&nbsp; <span class='diff-add'> .append($('<option/>').attr('value','code').text('Code'))</span>&nbsp; <span class='diff-add'> .append($('<option/>').attr('value','markdown').text('Markdown'))</span>&nbsp; <span class='diff-add'> .append($('<option/>').attr('value','raw').text('Raw NBConvert'))</span>&nbsp; <span class='diff-add'> .append($('<option/>').attr('value','heading').text('Heading'));</span>&nbsp; <span class='diff-add'> this.events.on('selected_cell_type_changed.Notebook', function (event, data) {</span>&nbsp; <span class='diff-add'> if (data.cell_type === 'heading') {</span>&nbsp; <span class='diff-add'> sel.val('Markdown');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> sel.val(data.cell_type);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> sel.change(function () {</span>&nbsp; <span class='diff-add'> var cell_type = $(this).val();</span>&nbsp; <span class='diff-add'> switch (cell_type) {</span>&nbsp; <span class='diff-add'> case 'code':</span>&nbsp; <span class='diff-add'> that.notebook.to_code();</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'markdown':</span>&nbsp; <span class='diff-add'> that.notebook.to_markdown();</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'raw':</span>&nbsp; <span class='diff-add'> that.notebook.to_raw();</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'heading':</span>&nbsp; <span class='diff-add'> that.notebook._warn_heading();</span>&nbsp; <span class='diff-add'> that.notebook.to_heading();</span>&nbsp; <span class='diff-add'> sel.val('markdown');</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> default:</span>&nbsp; <span class='diff-add'> console.log("unrecognized cell type:", cell_type);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> that.notebook.focus_cell();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return sel;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> MainToolBar.prototype._pseudo_actions.add_celltoolbar_list = function () {</span>&nbsp; <span class='diff-add'> var label = $('<span/>').addClass("navbar-text").text('Cell Toolbar:');</span>&nbsp; <span class='diff-add'> var select = $('<select/>')</span>&nbsp; <span class='diff-add'> .attr('id', 'ctb_select')</span>&nbsp; <span class='diff-add'> .addClass('form-control select-xs')</span>&nbsp; <span class='diff-add'> .append($('<option/>').attr('value', '').text('None'));</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> select.change(function() {</span>&nbsp; <span class='diff-add'> var val = $(this).val();</span>&nbsp; <span class='diff-add'> if (val ==='') {</span>&nbsp; <span class='diff-add'> celltoolbar.CellToolbar.global_hide();</span>&nbsp; <span class='diff-add'> delete that.notebook.metadata.celltoolbar;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> celltoolbar.CellToolbar.global_show();</span>&nbsp; <span class='diff-add'> celltoolbar.CellToolbar.activate_preset(val, that.events);</span>&nbsp; <span class='diff-add'> that.notebook.metadata.celltoolbar = val;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> that.notebook.focus_cell();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Setup the currently registered presets.</span>&nbsp; <span class='diff-add'> var presets = celltoolbar.CellToolbar.list_presets();</span>&nbsp; <span class='diff-add'> for (var i=0; i<presets.length; i++) {</span>&nbsp; <span class='diff-add'> var name = presets[i];</span>&nbsp; <span class='diff-add'> select.append($('<option/>').attr('value', name).text(name));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Setup future preset registrations.</span>&nbsp; <span class='diff-add'> this.events.on('preset_added.CellToolbar', function (event, data) {</span>&nbsp; <span class='diff-add'> var name = data.name;</span>&nbsp; <span class='diff-add'> select.append($('<option/>').attr('value', name).text(name));</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('unregistered_preset.CellToolbar', function (event, data) {</span>&nbsp; <span class='diff-add'> if (select.val() === data.name){</span>&nbsp; <span class='diff-add'> select.val('');</span>&nbsp; <span class='diff-add'> celltoolbar.CellToolbar.global_hide();</span>&nbsp; <span class='diff-add'> delete that.notebook.metadata.celltoolbar;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> select.find("option[value='"+name+"']" ).remove();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Update select value when a preset is activated.</span>&nbsp; <span class='diff-add'> this.events.on('preset_activated.CellToolbar', function (event, data) {</span>&nbsp; <span class='diff-add'> if (select.val() !== data.name){</span>&nbsp; <span class='diff-add'> select.val(data.name);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var wrapper = $('<div/>').addClass('btn-group');</span>&nbsp; <span class='diff-add'> wrapper.append(label).append(select);</span>&nbsp; <span class='diff-add'> return wrapper;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatibility.</span>&nbsp; <span class='diff-add'> IPython.MainToolBar = MainToolBar;</span>&nbsp; <span class='diff-add'> return {'MainToolBar': MainToolBar};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/manager.js b/ipynb/Array-feature-overlap-05_files/manager.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..d1bcd61</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/manager.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "underscore",</span>&nbsp; <span class='diff-add'> "backbone",</span>&nbsp; <span class='diff-add'> "jquery",</span>&nbsp; <span class='diff-add'> "base/js/utils",</span>&nbsp; <span class='diff-add'> "base/js/namespace",</span>&nbsp; <span class='diff-add'> "services/kernels/comm"</span>&nbsp; <span class='diff-add'>], function (_, Backbone, $, utils, IPython, comm) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> //--------------------------------------------------------------------</span>&nbsp; <span class='diff-add'> // WidgetManager class</span>&nbsp; <span class='diff-add'> //--------------------------------------------------------------------</span>&nbsp; <span class='diff-add'> var WidgetManager = function (comm_manager, notebook) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Public constructor</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> WidgetManager._managers.push(this);</span>&nbsp; <span class='diff-add'> // Attach a comm manager to the </span>&nbsp; <span class='diff-add'> this.keyboard_manager = notebook.keyboard_manager;</span>&nbsp; <span class='diff-add'> this.notebook = notebook;</span>&nbsp; <span class='diff-add'> this.comm_manager = comm_manager;</span>&nbsp; <span class='diff-add'> this.comm_target_name = 'ipython.widget';</span>&nbsp; <span class='diff-add'> this._models = {}; /* Dictionary of model ids and model instance promises */</span>&nbsp; <span class='diff-add'> // Register with the comm manager.</span>&nbsp; <span class='diff-add'> this.comm_manager.register_target(this.comm_target_name, $.proxy(this._handle_comm_open, this));</span>&nbsp; <span class='diff-add'> // Load the initial state of the widget manager if a load callback was</span>&nbsp; <span class='diff-add'> // registered.</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> if (WidgetManager._load_callback) {</span>&nbsp; <span class='diff-add'> Promise.resolve(WidgetManager._load_callback.call(this)).then(function(state) {</span>&nbsp; <span class='diff-add'> that.set_state(state);</span>&nbsp; <span class='diff-add'> }).catch(utils.reject('Error loading widget manager state', true));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Setup state saving code.</span>&nbsp; <span class='diff-add'> this.notebook.events.on('before_save.Notebook', function() {</span>&nbsp; <span class='diff-add'> var save_callback = WidgetManager._save_callback;</span>&nbsp; <span class='diff-add'> var options = WidgetManager._get_state_options;</span>&nbsp; <span class='diff-add'> if (save_callback) {</span>&nbsp; <span class='diff-add'> that.get_state(options).then(function(state) {</span>&nbsp; <span class='diff-add'> save_callback.call(that, state);</span>&nbsp; <span class='diff-add'> }).catch(utils.reject('Could not call widget save state callback.', true));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //--------------------------------------------------------------------</span>&nbsp; <span class='diff-add'> // Class level</span>&nbsp; <span class='diff-add'> //--------------------------------------------------------------------</span>&nbsp; <span class='diff-add'> WidgetManager._model_types = {}; /* Dictionary of model type names (target_name) and model types. */</span>&nbsp; <span class='diff-add'> WidgetManager._view_types = {}; /* Dictionary of view names and view types. */</span>&nbsp; <span class='diff-add'> WidgetManager._managers = []; /* List of widget managers */</span>&nbsp; <span class='diff-add'> WidgetManager._load_callback = null;</span>&nbsp; <span class='diff-add'> WidgetManager._save_callback = null;</span>&nbsp; <span class='diff-add'> WidgetManager.register_widget_model = function (model_name, model_type) {</span>&nbsp; <span class='diff-add'> /** </span>&nbsp; <span class='diff-add'> * Registers a widget model by name.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> WidgetManager._model_types[model_name] = model_type;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WidgetManager.register_widget_view = function (view_name, view_type) {</span>&nbsp; <span class='diff-add'> /** </span>&nbsp; <span class='diff-add'> * Registers a widget view by name.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> WidgetManager._view_types[view_name] = view_type;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WidgetManager.set_state_callbacks = function (load_callback, save_callback, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Registers callbacks for widget state persistence.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * Parameters</span>&nbsp; <span class='diff-add'> * ----------</span>&nbsp; <span class='diff-add'> * load_callback: function()</span>&nbsp; <span class='diff-add'> * function that is called when the widget manager state should be</span>&nbsp; <span class='diff-add'> * loaded. This function should return a promise for the widget</span>&nbsp; <span class='diff-add'> * manager state. An empty state is an empty dictionary `{}`.</span>&nbsp; <span class='diff-add'> * save_callback: function(state as dictionary)</span>&nbsp; <span class='diff-add'> * function that is called when the notebook is saved or autosaved.</span>&nbsp; <span class='diff-add'> * The current state of the widget manager is passed in as the first</span>&nbsp; <span class='diff-add'> * argument.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> WidgetManager._load_callback = load_callback;</span>&nbsp; <span class='diff-add'> WidgetManager._save_callback = save_callback;</span>&nbsp; <span class='diff-add'> WidgetManager._get_state_options = options;</span>&nbsp; <span class='diff-add'> // Use the load callback to immediately load widget states.</span>&nbsp; <span class='diff-add'> WidgetManager._managers.forEach(function(manager) {</span>&nbsp; <span class='diff-add'> if (load_callback) {</span>&nbsp; <span class='diff-add'> Promise.resolve(load_callback.call(manager)).then(function(state) {</span>&nbsp; <span class='diff-add'> manager.set_state(state);</span>&nbsp; <span class='diff-add'> }).catch(utils.reject('Error loading widget manager state', true));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Use local storage to persist widgets across page refresh by default.</span>&nbsp; <span class='diff-add'> // LocalStorage is per domain, so we need to explicitly set the URL</span>&nbsp; <span class='diff-add'> // that the widgets are associated with so they don't show on other </span>&nbsp; <span class='diff-add'> // pages hosted by the noteboook server.</span>&nbsp; <span class='diff-add'> var url = [window.location.protocol, '//', window.location.host, window.location.pathname].join('');</span>&nbsp; <span class='diff-add'> var key = 'widgets:' + url;</span>&nbsp; <span class='diff-add'> WidgetManager.set_state_callbacks(function() {</span>&nbsp; <span class='diff-add'> if (localStorage[key]) {</span>&nbsp; <span class='diff-add'> return JSON.parse(localStorage[key]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {};</span>&nbsp; <span class='diff-add'> }, function(state) {</span>&nbsp; <span class='diff-add'> localStorage[key] = JSON.stringify(state);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> //--------------------------------------------------------------------</span>&nbsp; <span class='diff-add'> // Instance level</span>&nbsp; <span class='diff-add'> //--------------------------------------------------------------------</span>&nbsp; <span class='diff-add'> WidgetManager.prototype.display_view = function(msg, model) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Displays a view for a particular model.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var cell = this.get_msg_cell(msg.parent_header.msg_id);</span>&nbsp; <span class='diff-add'> if (cell === null) {</span>&nbsp; <span class='diff-add'> return Promise.reject(new Error("Could not determine where the display" + </span>&nbsp; <span class='diff-add'> " message was from. Widget will not be displayed"));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return this.display_view_in_cell(cell, model)</span>&nbsp; <span class='diff-add'> .catch(utils.reject('Could not display view', true)); </span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WidgetManager.prototype.display_view_in_cell = function(cell, model) {</span>&nbsp; <span class='diff-add'> // Displays a view in a cell.</span>&nbsp; <span class='diff-add'> if (cell.display_widget_view) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return cell.display_widget_view(this.create_view(model, {</span>&nbsp; <span class='diff-add'> cell: cell,</span>&nbsp; <span class='diff-add'> // Only set cell_index when view is displayed as directly.</span>&nbsp; <span class='diff-add'> cell_index: that.notebook.find_cell_index(cell),</span>&nbsp; <span class='diff-add'> })).then(function(view) {</span>&nbsp; <span class='diff-add'> that._handle_display_view(view);</span>&nbsp; <span class='diff-add'> view.trigger('displayed');</span>&nbsp; <span class='diff-add'> return view;</span>&nbsp; <span class='diff-add'> }).catch(utils.reject('Could not create or display view', true)); </span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return Promise.reject(new Error('Cell does not have a `display_widget_view` method'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WidgetManager.prototype._handle_display_view = function (view) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Have the IPython keyboard manager disable its event</span>&nbsp; <span class='diff-add'> * handling so the widget can capture keyboard input.</span>&nbsp; <span class='diff-add'> * Note, this is only done on the outer most widgets.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this.keyboard_manager) {</span>&nbsp; <span class='diff-add'> this.keyboard_manager.register_events(view.$el);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (view.additional_elements) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < view.additional_elements.length; i++) {</span>&nbsp; <span class='diff-add'> this.keyboard_manager.register_events(view.additional_elements[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } </span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> WidgetManager.prototype.create_view = function(model, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Creates a promise for a view of a given model</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Make sure the view creation is not out of order with </span>&nbsp; <span class='diff-add'> * any state updates.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> model.state_change = model.state_change.then(function() {</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> return utils.load_class(model.get('_view_name'), model.get('_view_module'),</span>&nbsp; <span class='diff-add'> WidgetManager._view_types).then(function(ViewType) {</span>&nbsp; <span class='diff-add'> // If a view is passed into the method, use that view's cell as</span>&nbsp; <span class='diff-add'> // the cell for the view that is created.</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> if (options.parent !== undefined) {</span>&nbsp; <span class='diff-add'> options.cell = options.parent.options.cell;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Create and render the view...</span>&nbsp; <span class='diff-add'> var parameters = {model: model, options: options};</span>&nbsp; <span class='diff-add'> var view = new ViewType(parameters);</span>&nbsp; <span class='diff-add'> view.listenTo(model, 'destroy', view.remove);</span>&nbsp; <span class='diff-add'> return Promise.resolve(view.render()).then(function() {return view;});</span>&nbsp; <span class='diff-add'> }).catch(utils.reject("Couldn't create a view for model id '" + String(model.id) + "'", true));</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var id = utils.uuid();</span>&nbsp; <span class='diff-add'> model.views[id] = model.state_change;</span>&nbsp; <span class='diff-add'> model.state_change.then(function(view) { </span>&nbsp; <span class='diff-add'> view.once('remove', function() {</span>&nbsp; <span class='diff-add'> delete view.model.views[id];</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return model.state_change;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WidgetManager.prototype.get_msg_cell = function (msg_id) {</span>&nbsp; <span class='diff-add'> var cell = null;</span>&nbsp; <span class='diff-add'> // First, check to see if the msg was triggered by cell execution.</span>&nbsp; <span class='diff-add'> if (this.notebook) {</span>&nbsp; <span class='diff-add'> cell = this.notebook.get_msg_cell(msg_id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (cell !== null) {</span>&nbsp; <span class='diff-add'> return cell;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Second, check to see if a get_cell callback was defined</span>&nbsp; <span class='diff-add'> // for the message. get_cell callbacks are registered for</span>&nbsp; <span class='diff-add'> // widget messages, so this block is actually checking to see if the</span>&nbsp; <span class='diff-add'> // message was triggered by a widget.</span>&nbsp; <span class='diff-add'> var kernel = this.comm_manager.kernel;</span>&nbsp; <span class='diff-add'> if (kernel) {</span>&nbsp; <span class='diff-add'> var callbacks = kernel.get_callbacks_for_msg(msg_id);</span>&nbsp; <span class='diff-add'> if (callbacks && callbacks.iopub &&</span>&nbsp; <span class='diff-add'> callbacks.iopub.get_cell !== undefined) {</span>&nbsp; <span class='diff-add'> return callbacks.iopub.get_cell();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Not triggered by a cell or widget (no get_cell callback </span>&nbsp; <span class='diff-add'> // exists).</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WidgetManager.prototype.callbacks = function (view) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * callback handlers specific a view</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var callbacks = {};</span>&nbsp; <span class='diff-add'> if (view && view.options.cell) {</span>&nbsp; <span class='diff-add'> // Try to get output handlers</span>&nbsp; <span class='diff-add'> var cell = view.options.cell;</span>&nbsp; <span class='diff-add'> var handle_output = null;</span>&nbsp; <span class='diff-add'> var handle_clear_output = null;</span>&nbsp; <span class='diff-add'> if (cell.output_area) {</span>&nbsp; <span class='diff-add'> handle_output = $.proxy(cell.output_area.handle_output, cell.output_area);</span>&nbsp; <span class='diff-add'> handle_clear_output = $.proxy(cell.output_area.handle_clear_output, cell.output_area);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Create callback dictionary using what is known</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> callbacks = {</span>&nbsp; <span class='diff-add'> iopub : {</span>&nbsp; <span class='diff-add'> output : handle_output,</span>&nbsp; <span class='diff-add'> clear_output : handle_clear_output,</span>&nbsp; <span class='diff-add'> // Special function only registered by widget messages.</span>&nbsp; <span class='diff-add'> // Allows us to get the cell for a message so we know</span>&nbsp; <span class='diff-add'> // where to add widgets if the code requires it.</span>&nbsp; <span class='diff-add'> get_cell : function () {</span>&nbsp; <span class='diff-add'> return cell;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return callbacks;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WidgetManager.prototype.get_model = function (model_id) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get a promise for a model by model id.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return this._models[model_id];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WidgetManager.prototype._handle_comm_open = function (comm, msg) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle when a comm is opened.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return this.create_model({</span>&nbsp; <span class='diff-add'> model_name: msg.content.data.model_name, </span>&nbsp; <span class='diff-add'> model_module: msg.content.data.model_module, </span>&nbsp; <span class='diff-add'> comm: comm}).catch(utils.reject("Couldn't create a model.", true));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WidgetManager.prototype.create_model = function (options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Create and return a promise for a new widget model</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Minimally, one must provide the model_name and widget_class</span>&nbsp; <span class='diff-add'> * parameters to create a model from Javascript.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Example</span>&nbsp; <span class='diff-add'> * --------</span>&nbsp; <span class='diff-add'> * JS:</span>&nbsp; <span class='diff-add'> * IPython.notebook.kernel.widget_manager.create_model({</span>&nbsp; <span class='diff-add'> * model_name: 'WidgetModel', </span>&nbsp; <span class='diff-add'> * widget_class: 'IPython.html.widgets.widget_int.IntSlider'})</span>&nbsp; <span class='diff-add'> * .then(function(model) { console.log('Create success!', model); },</span>&nbsp; <span class='diff-add'> * $.proxy(console.error, console));</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters</span>&nbsp; <span class='diff-add'> * ----------</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of options with the following contents:</span>&nbsp; <span class='diff-add'> * model_name: string</span>&nbsp; <span class='diff-add'> * Target name of the widget model to create.</span>&nbsp; <span class='diff-add'> * model_module: (optional) string</span>&nbsp; <span class='diff-add'> * Module name of the widget model to create.</span>&nbsp; <span class='diff-add'> * widget_class: (optional) string</span>&nbsp; <span class='diff-add'> * Target name of the widget in the back-end.</span>&nbsp; <span class='diff-add'> * comm: (optional) Comm</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Create a comm if it wasn't provided.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var comm = options.comm;</span>&nbsp; <span class='diff-add'> if (!comm) {</span>&nbsp; <span class='diff-add'> comm = this.comm_manager.new_comm('ipython.widget', {'widget_class': options.widget_class});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var model_id = comm.comm_id;</span>&nbsp; <span class='diff-add'> var model_promise = utils.load_class(options.model_name, options.model_module, WidgetManager._model_types)</span>&nbsp; <span class='diff-add'> .then(function(ModelType) {</span>&nbsp; <span class='diff-add'> var widget_model = new ModelType(that, model_id, comm);</span>&nbsp; <span class='diff-add'> widget_model.once('comm:close', function () {</span>&nbsp; <span class='diff-add'> delete that._models[model_id];</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> widget_model.name = options.model_name;</span>&nbsp; <span class='diff-add'> widget_model.module = options.model_module;</span>&nbsp; <span class='diff-add'> return widget_model;</span>&nbsp; <span class='diff-add'> }, function(error) {</span>&nbsp; <span class='diff-add'> delete that._models[model_id];</span>&nbsp; <span class='diff-add'> var wrapped_error = new utils.WrappedError("Couldn't create model", error);</span>&nbsp; <span class='diff-add'> return Promise.reject(wrapped_error);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this._models[model_id] = model_promise;</span>&nbsp; <span class='diff-add'> return model_promise;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WidgetManager.prototype.get_state = function(options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Asynchronously get the state of the widget manager.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * This includes all of the widget models and the cells that they are</span>&nbsp; <span class='diff-add'> * displayed in.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters</span>&nbsp; <span class='diff-add'> * ----------</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of options with the following contents:</span>&nbsp; <span class='diff-add'> * only_displayed: (optional) boolean=false</span>&nbsp; <span class='diff-add'> * Only return models with one or more displayed views.</span>&nbsp; <span class='diff-add'> * not_live: (optional) boolean=false</span>&nbsp; <span class='diff-add'> * Include models that have comms with severed connections.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Returns</span>&nbsp; <span class='diff-add'> * -------</span>&nbsp; <span class='diff-add'> * Promise for a state dictionary</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return utils.resolve_promises_dict(this._models).then(function(models) {</span>&nbsp; <span class='diff-add'> var state = {};</span>&nbsp; <span class='diff-add'> var model_promises = [];</span>&nbsp; <span class='diff-add'> for (var model_id in models) {</span>&nbsp; <span class='diff-add'> if (models.hasOwnProperty(model_id)) {</span>&nbsp; <span class='diff-add'> var model = models[model_id];</span>&nbsp; <span class='diff-add'> // If the model has one or more views defined for it,</span>&nbsp; <span class='diff-add'> // consider it displayed.</span>&nbsp; <span class='diff-add'> var displayed_flag = !(options && options.only_displayed) || Object.keys(model.views).length > 0;</span>&nbsp; <span class='diff-add'> var live_flag = (options && options.not_live) || model.comm_live;</span>&nbsp; <span class='diff-add'> if (displayed_flag && live_flag) {</span>&nbsp; <span class='diff-add'> state[model_id] = {</span>&nbsp; <span class='diff-add'> model_name: model.name,</span>&nbsp; <span class='diff-add'> model_module: model.module,</span>&nbsp; <span class='diff-add'> state: model.get_state(),</span>&nbsp; <span class='diff-add'> views: [],</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Get the views that are displayed *now*.</span>&nbsp; <span class='diff-add'> (function(local_state) {</span>&nbsp; <span class='diff-add'> model_promises.push(utils.resolve_promises_dict(model.views).then(function(model_views) {</span>&nbsp; <span class='diff-add'> for (var id in model_views) {</span>&nbsp; <span class='diff-add'> if (model_views.hasOwnProperty(id)) {</span>&nbsp; <span class='diff-add'> var view = model_views[id];</span>&nbsp; <span class='diff-add'> if (view.options.cell_index) {</span>&nbsp; <span class='diff-add'> local_state.views.push(view.options.cell_index);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }));</span>&nbsp; <span class='diff-add'> })(state[model_id]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return Promise.all(model_promises).then(function() { return state; });</span>&nbsp; <span class='diff-add'> }).catch(utils.reject('Could not get state of widget manager', true));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> WidgetManager.prototype.set_state = function(state) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set the notebook's state.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Reconstructs all of the widget models and attempts to redisplay the</span>&nbsp; <span class='diff-add'> * widgets in the appropriate cells by cell index.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Get the kernel when it's available.</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return this._get_connected_kernel().then(function(kernel) {</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Recreate all the widget models for the given state and </span>&nbsp; <span class='diff-add'> // display the views.</span>&nbsp; <span class='diff-add'> that.all_views = [];</span>&nbsp; <span class='diff-add'> var model_ids = Object.keys(state);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < model_ids.length; i++) {</span>&nbsp; <span class='diff-add'> var model_id = model_ids[i];</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Recreate a comm using the widget's model id (model_id == comm_id).</span>&nbsp; <span class='diff-add'> var new_comm = new comm.Comm(kernel.widget_manager.comm_target_name, model_id);</span>&nbsp; <span class='diff-add'> kernel.comm_manager.register_comm(new_comm);</span>&nbsp; <span class='diff-add'> // Create the model using the recreated comm. When the model is</span>&nbsp; <span class='diff-add'> // created we don't know yet if the comm is valid so set_comm_live</span>&nbsp; <span class='diff-add'> // false. Once we receive the first state push from the back-end</span>&nbsp; <span class='diff-add'> // we know the comm is alive.</span>&nbsp; <span class='diff-add'> var views = kernel.widget_manager.create_model({</span>&nbsp; <span class='diff-add'> comm: new_comm, </span>&nbsp; <span class='diff-add'> model_name: state[model_id].model_name, </span>&nbsp; <span class='diff-add'> model_module: state[model_id].model_module})</span>&nbsp; <span class='diff-add'> .then(function(model) {</span>&nbsp; <span class='diff-add'> model.set_comm_live(false);</span>&nbsp; <span class='diff-add'> var view_promise = Promise.resolve().then(function() {</span>&nbsp; <span class='diff-add'> return model.set_state(state[model.id].state);</span>&nbsp; <span class='diff-add'> }).then(function() {</span>&nbsp; <span class='diff-add'> model.request_state().then(function() {</span>&nbsp; <span class='diff-add'> model.set_comm_live(true);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Display the views of the model.</span>&nbsp; <span class='diff-add'> var views = [];</span>&nbsp; <span class='diff-add'> var model_views = state[model.id].views;</span>&nbsp; <span class='diff-add'> for (var j=0; j<model_views.length; j++) {</span>&nbsp; <span class='diff-add'> var cell_index = model_views[j];</span>&nbsp; <span class='diff-add'> var cell = that.notebook.get_cell(cell_index);</span>&nbsp; <span class='diff-add'> views.push(that.display_view_in_cell(cell, model));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return Promise.all(views);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return view_promise;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> that.all_views.push(views);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return Promise.all(that.all_views);</span>&nbsp; <span class='diff-add'> }).catch(utils.reject('Could not set widget manager state.', true)); </span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WidgetManager.prototype._get_connected_kernel = function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Gets a promise for a connected kernel</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return new Promise(function(resolve, reject) {</span>&nbsp; <span class='diff-add'> if (that.comm_manager && </span>&nbsp; <span class='diff-add'> that.comm_manager.kernel && </span>&nbsp; <span class='diff-add'> that.comm_manager.kernel.is_connected()) {</span>&nbsp; <span class='diff-add'> resolve(that.comm_manager.kernel);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> that.notebook.events.on('kernel_connected.Kernel', function(event, data) {</span>&nbsp; <span class='diff-add'> resolve(data.kernel);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> } </span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatibility.</span>&nbsp; <span class='diff-add'> IPython.WidgetManager = WidgetManager;</span>&nbsp; <span class='diff-add'> return {'WidgetManager': WidgetManager};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/markdown.js b/ipynb/Array-feature-overlap-05_files/markdown.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..3c80311</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/markdown.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../../lib/codemirror"), require("../xml/xml"), require("../meta"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../../lib/codemirror", "../xml/xml", "../meta"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'>"use strict";</span>&nbsp; <span class='diff-add'>CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {</span>&nbsp; <span class='diff-add'> var htmlFound = CodeMirror.modes.hasOwnProperty("xml");</span>&nbsp; <span class='diff-add'> var htmlMode = CodeMirror.getMode(cmCfg, htmlFound ? {name: "xml", htmlMode: true} : "text/plain");</span>&nbsp; <span class='diff-add'> function getMode(name) {</span>&nbsp; <span class='diff-add'> if (CodeMirror.findModeByName) {</span>&nbsp; <span class='diff-add'> var found = CodeMirror.findModeByName(name);</span>&nbsp; <span class='diff-add'> if (found) name = found.mime || found.mimes[0];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var mode = CodeMirror.getMode(cmCfg, name);</span>&nbsp; <span class='diff-add'> return mode.name == "null" ? null : mode;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Should characters that affect highlighting be highlighted separate?</span>&nbsp; <span class='diff-add'> // Does not include characters that will be output (such as `1.` and `-` for lists)</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting === undefined)</span>&nbsp; <span class='diff-add'> modeCfg.highlightFormatting = false;</span>&nbsp; <span class='diff-add'> // Maximum number of nested blockquotes. Set to 0 for infinite nesting.</span>&nbsp; <span class='diff-add'> // Excess `>` will emit `error` token.</span>&nbsp; <span class='diff-add'> if (modeCfg.maxBlockquoteDepth === undefined)</span>&nbsp; <span class='diff-add'> modeCfg.maxBlockquoteDepth = 0;</span>&nbsp; <span class='diff-add'> // Should underscores in words open/close em/strong?</span>&nbsp; <span class='diff-add'> if (modeCfg.underscoresBreakWords === undefined)</span>&nbsp; <span class='diff-add'> modeCfg.underscoresBreakWords = true;</span>&nbsp; <span class='diff-add'> // Turn on fenced code blocks? ("```" to start/end)</span>&nbsp; <span class='diff-add'> if (modeCfg.fencedCodeBlocks === undefined) modeCfg.fencedCodeBlocks = false;</span>&nbsp; <span class='diff-add'> // Turn on task lists? ("- [ ] " and "- [x] ")</span>&nbsp; <span class='diff-add'> if (modeCfg.taskLists === undefined) modeCfg.taskLists = false;</span>&nbsp; <span class='diff-add'> // Turn on strikethrough syntax</span>&nbsp; <span class='diff-add'> if (modeCfg.strikethrough === undefined)</span>&nbsp; <span class='diff-add'> modeCfg.strikethrough = false;</span>&nbsp; <span class='diff-add'> var codeDepth = 0;</span>&nbsp; <span class='diff-add'> var header = 'header'</span>&nbsp; <span class='diff-add'> , code = 'comment'</span>&nbsp; <span class='diff-add'> , quote = 'quote'</span>&nbsp; <span class='diff-add'> , list1 = 'variable-2'</span>&nbsp; <span class='diff-add'> , list2 = 'variable-3'</span>&nbsp; <span class='diff-add'> , list3 = 'keyword'</span>&nbsp; <span class='diff-add'> , hr = 'hr'</span>&nbsp; <span class='diff-add'> , image = 'tag'</span>&nbsp; <span class='diff-add'> , formatting = 'formatting'</span>&nbsp; <span class='diff-add'> , linkinline = 'link'</span>&nbsp; <span class='diff-add'> , linkemail = 'link'</span>&nbsp; <span class='diff-add'> , linktext = 'link'</span>&nbsp; <span class='diff-add'> , linkhref = 'string'</span>&nbsp; <span class='diff-add'> , em = 'em'</span>&nbsp; <span class='diff-add'> , strong = 'strong'</span>&nbsp; <span class='diff-add'> , strikethrough = 'strikethrough';</span>&nbsp; <span class='diff-add'> var hrRE = /^([*\-=_])(?:\s*\1){2,}\s*$/</span>&nbsp; <span class='diff-add'> , ulRE = /^[*\-+]\s+/</span>&nbsp; <span class='diff-add'> , olRE = /^[0-9]+\.\s+/</span>&nbsp; <span class='diff-add'> , taskListRE = /^\[(x| )\](?=\s)/ // Must follow ulRE or olRE</span>&nbsp; <span class='diff-add'> , atxHeaderRE = /^#+/</span>&nbsp; <span class='diff-add'> , setextHeaderRE = /^(?:\={1,}|-{1,})$/</span>&nbsp; <span class='diff-add'> , textRE = /^[^#!\[\]*_\\<>` "'(~]+/;</span>&nbsp; <span class='diff-add'> function switchInline(stream, state, f) {</span>&nbsp; <span class='diff-add'> state.f = state.inline = f;</span>&nbsp; <span class='diff-add'> return f(stream, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function switchBlock(stream, state, f) {</span>&nbsp; <span class='diff-add'> state.f = state.block = f;</span>&nbsp; <span class='diff-add'> return f(stream, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Blocks</span>&nbsp; <span class='diff-add'> function blankLine(state) {</span>&nbsp; <span class='diff-add'> // Reset linkTitle state</span>&nbsp; <span class='diff-add'> state.linkTitle = false;</span>&nbsp; <span class='diff-add'> // Reset EM state</span>&nbsp; <span class='diff-add'> state.em = false;</span>&nbsp; <span class='diff-add'> // Reset STRONG state</span>&nbsp; <span class='diff-add'> state.strong = false;</span>&nbsp; <span class='diff-add'> // Reset strikethrough state</span>&nbsp; <span class='diff-add'> state.strikethrough = false;</span>&nbsp; <span class='diff-add'> // Reset state.quote</span>&nbsp; <span class='diff-add'> state.quote = 0;</span>&nbsp; <span class='diff-add'> if (!htmlFound && state.f == htmlBlock) {</span>&nbsp; <span class='diff-add'> state.f = inlineNormal;</span>&nbsp; <span class='diff-add'> state.block = blockNormal;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Reset state.trailingSpace</span>&nbsp; <span class='diff-add'> state.trailingSpace = 0;</span>&nbsp; <span class='diff-add'> state.trailingSpaceNewLine = false;</span>&nbsp; <span class='diff-add'> // Mark this line as blank</span>&nbsp; <span class='diff-add'> state.thisLineHasContent = false;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function blockNormal(stream, state) {</span>&nbsp; <span class='diff-add'> var sol = stream.sol();</span>&nbsp; <span class='diff-add'> var prevLineIsList = (state.list !== false);</span>&nbsp; <span class='diff-add'> if (state.list !== false && state.indentationDiff >= 0) { // Continued list</span>&nbsp; <span class='diff-add'> if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block</span>&nbsp; <span class='diff-add'> state.indentation -= state.indentationDiff;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> state.list = null;</span>&nbsp; <span class='diff-add'> } else if (state.list !== false && state.indentation > 0) {</span>&nbsp; <span class='diff-add'> state.list = null;</span>&nbsp; <span class='diff-add'> state.listDepth = Math.floor(state.indentation / 4);</span>&nbsp; <span class='diff-add'> } else if (state.list !== false) { // No longer a list</span>&nbsp; <span class='diff-add'> state.list = false;</span>&nbsp; <span class='diff-add'> state.listDepth = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var match = null;</span>&nbsp; <span class='diff-add'> if (state.indentationDiff >= 4) {</span>&nbsp; <span class='diff-add'> state.indentation -= 4;</span>&nbsp; <span class='diff-add'> stream.skipToEnd();</span>&nbsp; <span class='diff-add'> return code;</span>&nbsp; <span class='diff-add'> } else if (stream.eatSpace()) {</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> } else if (match = stream.match(atxHeaderRE)) {</span>&nbsp; <span class='diff-add'> state.header = match[0].length <= 6 ? match[0].length : 6;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "header";</span>&nbsp; <span class='diff-add'> state.f = state.inline;</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> } else if (state.prevLineHasContent && (match = stream.match(setextHeaderRE))) {</span>&nbsp; <span class='diff-add'> state.header = match[0].charAt(0) == '=' ? 1 : 2;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "header";</span>&nbsp; <span class='diff-add'> state.f = state.inline;</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> } else if (stream.eat('>')) {</span>&nbsp; <span class='diff-add'> state.indentation++;</span>&nbsp; <span class='diff-add'> state.quote = sol ? 1 : state.quote + 1;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "quote";</span>&nbsp; <span class='diff-add'> stream.eatSpace();</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> } else if (stream.peek() === '[') {</span>&nbsp; <span class='diff-add'> return switchInline(stream, state, footnoteLink);</span>&nbsp; <span class='diff-add'> } else if (stream.match(hrRE, true)) {</span>&nbsp; <span class='diff-add'> return hr;</span>&nbsp; <span class='diff-add'> } else if ((!state.prevLineHasContent || prevLineIsList) && (stream.match(ulRE, false) || stream.match(olRE, false))) {</span>&nbsp; <span class='diff-add'> var listType = null;</span>&nbsp; <span class='diff-add'> if (stream.match(ulRE, true)) {</span>&nbsp; <span class='diff-add'> listType = 'ul';</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> stream.match(olRE, true);</span>&nbsp; <span class='diff-add'> listType = 'ol';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> state.indentation += 4;</span>&nbsp; <span class='diff-add'> state.list = true;</span>&nbsp; <span class='diff-add'> state.listDepth++;</span>&nbsp; <span class='diff-add'> if (modeCfg.taskLists && stream.match(taskListRE, false)) {</span>&nbsp; <span class='diff-add'> state.taskList = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> state.f = state.inline;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = ["list", "list-" + listType];</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> } else if (modeCfg.fencedCodeBlocks && stream.match(/^```[ \t]*([\w+#]*)/, true)) {</span>&nbsp; <span class='diff-add'> // try switching mode</span>&nbsp; <span class='diff-add'> state.localMode = getMode(RegExp.$1);</span>&nbsp; <span class='diff-add'> if (state.localMode) state.localState = state.localMode.startState();</span>&nbsp; <span class='diff-add'> state.f = state.block = local;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "code-block";</span>&nbsp; <span class='diff-add'> state.code = true;</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return switchInline(stream, state, state.inline);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function htmlBlock(stream, state) {</span>&nbsp; <span class='diff-add'> var style = htmlMode.token(stream, state.htmlState);</span>&nbsp; <span class='diff-add'> if ((htmlFound && state.htmlState.tagStart === null && !state.htmlState.context) ||</span>&nbsp; <span class='diff-add'> (state.md_inside && stream.current().indexOf(">") > -1)) {</span>&nbsp; <span class='diff-add'> state.f = inlineNormal;</span>&nbsp; <span class='diff-add'> state.block = blockNormal;</span>&nbsp; <span class='diff-add'> state.htmlState = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return style;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function local(stream, state) {</span>&nbsp; <span class='diff-add'> if (stream.sol() && stream.match("```", false)) {</span>&nbsp; <span class='diff-add'> state.localMode = state.localState = null;</span>&nbsp; <span class='diff-add'> state.f = state.block = leavingLocal;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> } else if (state.localMode) {</span>&nbsp; <span class='diff-add'> return state.localMode.token(stream, state.localState);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> stream.skipToEnd();</span>&nbsp; <span class='diff-add'> return code;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function leavingLocal(stream, state) {</span>&nbsp; <span class='diff-add'> stream.match("```");</span>&nbsp; <span class='diff-add'> state.block = blockNormal;</span>&nbsp; <span class='diff-add'> state.f = inlineNormal;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "code-block";</span>&nbsp; <span class='diff-add'> state.code = true;</span>&nbsp; <span class='diff-add'> var returnType = getType(state);</span>&nbsp; <span class='diff-add'> state.code = false;</span>&nbsp; <span class='diff-add'> return returnType;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Inline</span>&nbsp; <span class='diff-add'> function getType(state) {</span>&nbsp; <span class='diff-add'> var styles = [];</span>&nbsp; <span class='diff-add'> if (state.formatting) {</span>&nbsp; <span class='diff-add'> styles.push(formatting);</span>&nbsp; <span class='diff-add'> if (typeof state.formatting === "string") state.formatting = [state.formatting];</span>&nbsp; <span class='diff-add'> for (var i = 0; i < state.formatting.length; i++) {</span>&nbsp; <span class='diff-add'> styles.push(formatting + "-" + state.formatting[i]);</span>&nbsp; <span class='diff-add'> if (state.formatting[i] === "header") {</span>&nbsp; <span class='diff-add'> styles.push(formatting + "-" + state.formatting[i] + "-" + state.header);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Add `formatting-quote` and `formatting-quote-#` for blockquotes</span>&nbsp; <span class='diff-add'> // Add `error` instead if the maximum blockquote nesting depth is passed</span>&nbsp; <span class='diff-add'> if (state.formatting[i] === "quote") {</span>&nbsp; <span class='diff-add'> if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {</span>&nbsp; <span class='diff-add'> styles.push(formatting + "-" + state.formatting[i] + "-" + state.quote);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> styles.push("error");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (state.taskOpen) {</span>&nbsp; <span class='diff-add'> styles.push("meta");</span>&nbsp; <span class='diff-add'> return styles.length ? styles.join(' ') : null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (state.taskClosed) {</span>&nbsp; <span class='diff-add'> styles.push("property");</span>&nbsp; <span class='diff-add'> return styles.length ? styles.join(' ') : null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (state.linkHref) {</span>&nbsp; <span class='diff-add'> styles.push(linkhref);</span>&nbsp; <span class='diff-add'> return styles.length ? styles.join(' ') : null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (state.strong) { styles.push(strong); }</span>&nbsp; <span class='diff-add'> if (state.em) { styles.push(em); }</span>&nbsp; <span class='diff-add'> if (state.strikethrough) { styles.push(strikethrough); }</span>&nbsp; <span class='diff-add'> if (state.linkText) { styles.push(linktext); }</span>&nbsp; <span class='diff-add'> if (state.code) { styles.push(code); }</span>&nbsp; <span class='diff-add'> if (state.header) { styles.push(header); styles.push(header + "-" + state.header); }</span>&nbsp; <span class='diff-add'> if (state.quote) {</span>&nbsp; <span class='diff-add'> styles.push(quote);</span>&nbsp; <span class='diff-add'> // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth</span>&nbsp; <span class='diff-add'> if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {</span>&nbsp; <span class='diff-add'> styles.push(quote + "-" + state.quote);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> styles.push(quote + "-" + modeCfg.maxBlockquoteDepth);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (state.list !== false) {</span>&nbsp; <span class='diff-add'> var listMod = (state.listDepth - 1) % 3;</span>&nbsp; <span class='diff-add'> if (!listMod) {</span>&nbsp; <span class='diff-add'> styles.push(list1);</span>&nbsp; <span class='diff-add'> } else if (listMod === 1) {</span>&nbsp; <span class='diff-add'> styles.push(list2);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> styles.push(list3);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (state.trailingSpaceNewLine) {</span>&nbsp; <span class='diff-add'> styles.push("trailing-space-new-line");</span>&nbsp; <span class='diff-add'> } else if (state.trailingSpace) {</span>&nbsp; <span class='diff-add'> styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b"));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return styles.length ? styles.join(' ') : null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function handleText(stream, state) {</span>&nbsp; <span class='diff-add'> if (stream.match(textRE, true)) {</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return undefined;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function inlineNormal(stream, state) {</span>&nbsp; <span class='diff-add'> var style = state.text(stream, state);</span>&nbsp; <span class='diff-add'> if (typeof style !== 'undefined')</span>&nbsp; <span class='diff-add'> return style;</span>&nbsp; <span class='diff-add'> if (state.list) { // List marker (*, +, -, 1., etc)</span>&nbsp; <span class='diff-add'> state.list = null;</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (state.taskList) {</span>&nbsp; <span class='diff-add'> var taskOpen = stream.match(taskListRE, true)[1] !== "x";</span>&nbsp; <span class='diff-add'> if (taskOpen) state.taskOpen = true;</span>&nbsp; <span class='diff-add'> else state.taskClosed = true;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "task";</span>&nbsp; <span class='diff-add'> state.taskList = false;</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> state.taskOpen = false;</span>&nbsp; <span class='diff-add'> state.taskClosed = false;</span>&nbsp; <span class='diff-add'> if (state.header && stream.match(/^#+$/, true)) {</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "header";</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Get sol() value now, before character is consumed</span>&nbsp; <span class='diff-add'> var sol = stream.sol();</span>&nbsp; <span class='diff-add'> var ch = stream.next();</span>&nbsp; <span class='diff-add'> if (ch === '\\') {</span>&nbsp; <span class='diff-add'> stream.next();</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) {</span>&nbsp; <span class='diff-add'> var type = getType(state);</span>&nbsp; <span class='diff-add'> return type ? type + " formatting-escape" : "formatting-escape";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Matches link titles present on next line</span>&nbsp; <span class='diff-add'> if (state.linkTitle) {</span>&nbsp; <span class='diff-add'> state.linkTitle = false;</span>&nbsp; <span class='diff-add'> var matchCh = ch;</span>&nbsp; <span class='diff-add'> if (ch === '(') {</span>&nbsp; <span class='diff-add'> matchCh = ')';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");</span>&nbsp; <span class='diff-add'> var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh;</span>&nbsp; <span class='diff-add'> if (stream.match(new RegExp(regex), true)) {</span>&nbsp; <span class='diff-add'> return linkhref;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // If this block is changed, it may need to be updated in GFM mode</span>&nbsp; <span class='diff-add'> if (ch === '`') {</span>&nbsp; <span class='diff-add'> var previousFormatting = state.formatting;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "code";</span>&nbsp; <span class='diff-add'> var t = getType(state);</span>&nbsp; <span class='diff-add'> var before = stream.pos;</span>&nbsp; <span class='diff-add'> stream.eatWhile('`');</span>&nbsp; <span class='diff-add'> var difference = 1 + stream.pos - before;</span>&nbsp; <span class='diff-add'> if (!state.code) {</span>&nbsp; <span class='diff-add'> codeDepth = difference;</span>&nbsp; <span class='diff-add'> state.code = true;</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> if (difference === codeDepth) { // Must be exact</span>&nbsp; <span class='diff-add'> state.code = false;</span>&nbsp; <span class='diff-add'> return t;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> state.formatting = previousFormatting;</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (state.code) {</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) {</span>&nbsp; <span class='diff-add'> stream.match(/\[[^\]]*\]/);</span>&nbsp; <span class='diff-add'> state.inline = state.f = linkHref;</span>&nbsp; <span class='diff-add'> return image;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ch === '[' && stream.match(/.*\](\(.*\)| ?\[.*\])/, false)) {</span>&nbsp; <span class='diff-add'> state.linkText = true;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ch === ']' && state.linkText && stream.match(/\(.*\)| ?\[.*\]/, false)) {</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span>&nbsp; <span class='diff-add'> var type = getType(state);</span>&nbsp; <span class='diff-add'> state.linkText = false;</span>&nbsp; <span class='diff-add'> state.inline = state.f = linkHref;</span>&nbsp; <span class='diff-add'> return type;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, false)) {</span>&nbsp; <span class='diff-add'> state.f = state.inline = linkInline;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span>&nbsp; <span class='diff-add'> var type = getType(state);</span>&nbsp; <span class='diff-add'> if (type){</span>&nbsp; <span class='diff-add'> type += " ";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> type = "";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return type + linkinline;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, false)) {</span>&nbsp; <span class='diff-add'> state.f = state.inline = linkInline;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span>&nbsp; <span class='diff-add'> var type = getType(state);</span>&nbsp; <span class='diff-add'> if (type){</span>&nbsp; <span class='diff-add'> type += " ";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> type = "";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return type + linkemail;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ch === '<' && stream.match(/^\w/, false)) {</span>&nbsp; <span class='diff-add'> if (stream.string.indexOf(">") != -1) {</span>&nbsp; <span class='diff-add'> var atts = stream.string.substring(1,stream.string.indexOf(">"));</span>&nbsp; <span class='diff-add'> if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) {</span>&nbsp; <span class='diff-add'> state.md_inside = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> stream.backUp(1);</span>&nbsp; <span class='diff-add'> state.htmlState = CodeMirror.startState(htmlMode);</span>&nbsp; <span class='diff-add'> return switchBlock(stream, state, htmlBlock);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ch === '<' && stream.match(/^\/\w*?>/)) {</span>&nbsp; <span class='diff-add'> state.md_inside = false;</span>&nbsp; <span class='diff-add'> return "tag";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var ignoreUnderscore = false;</span>&nbsp; <span class='diff-add'> if (!modeCfg.underscoresBreakWords) {</span>&nbsp; <span class='diff-add'> if (ch === '_' && stream.peek() !== '_' && stream.match(/(\w)/, false)) {</span>&nbsp; <span class='diff-add'> var prevPos = stream.pos - 2;</span>&nbsp; <span class='diff-add'> if (prevPos >= 0) {</span>&nbsp; <span class='diff-add'> var prevCh = stream.string.charAt(prevPos);</span>&nbsp; <span class='diff-add'> if (prevCh !== '_' && prevCh.match(/(\w)/, false)) {</span>&nbsp; <span class='diff-add'> ignoreUnderscore = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ch === '*' || (ch === '_' && !ignoreUnderscore)) {</span>&nbsp; <span class='diff-add'> if (sol && stream.peek() === ' ') {</span>&nbsp; <span class='diff-add'> // Do nothing, surrounded by newline and space</span>&nbsp; <span class='diff-add'> } else if (state.strong === ch && stream.eat(ch)) { // Remove STRONG</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "strong";</span>&nbsp; <span class='diff-add'> var t = getType(state);</span>&nbsp; <span class='diff-add'> state.strong = false;</span>&nbsp; <span class='diff-add'> return t;</span>&nbsp; <span class='diff-add'> } else if (!state.strong && stream.eat(ch)) { // Add STRONG</span>&nbsp; <span class='diff-add'> state.strong = ch;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "strong";</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> } else if (state.em === ch) { // Remove EM</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "em";</span>&nbsp; <span class='diff-add'> var t = getType(state);</span>&nbsp; <span class='diff-add'> state.em = false;</span>&nbsp; <span class='diff-add'> return t;</span>&nbsp; <span class='diff-add'> } else if (!state.em) { // Add EM</span>&nbsp; <span class='diff-add'> state.em = ch;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "em";</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (ch === ' ') {</span>&nbsp; <span class='diff-add'> if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces</span>&nbsp; <span class='diff-add'> if (stream.peek() === ' ') { // Surrounded by spaces, ignore</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> } else { // Not surrounded by spaces, back up pointer</span>&nbsp; <span class='diff-add'> stream.backUp(1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (modeCfg.strikethrough) {</span>&nbsp; <span class='diff-add'> if (ch === '~' && stream.eatWhile(ch)) {</span>&nbsp; <span class='diff-add'> if (state.strikethrough) {// Remove strikethrough</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "strikethrough";</span>&nbsp; <span class='diff-add'> var t = getType(state);</span>&nbsp; <span class='diff-add'> state.strikethrough = false;</span>&nbsp; <span class='diff-add'> return t;</span>&nbsp; <span class='diff-add'> } else if (stream.match(/^[^\s]/, false)) {// Add strikethrough</span>&nbsp; <span class='diff-add'> state.strikethrough = true;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "strikethrough";</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (ch === ' ') {</span>&nbsp; <span class='diff-add'> if (stream.match(/^~~/, true)) { // Probably surrounded by space</span>&nbsp; <span class='diff-add'> if (stream.peek() === ' ') { // Surrounded by spaces, ignore</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> } else { // Not surrounded by spaces, back up pointer</span>&nbsp; <span class='diff-add'> stream.backUp(2);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ch === ' ') {</span>&nbsp; <span class='diff-add'> if (stream.match(/ +$/, false)) {</span>&nbsp; <span class='diff-add'> state.trailingSpace++;</span>&nbsp; <span class='diff-add'> } else if (state.trailingSpace) {</span>&nbsp; <span class='diff-add'> state.trailingSpaceNewLine = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function linkInline(stream, state) {</span>&nbsp; <span class='diff-add'> var ch = stream.next();</span>&nbsp; <span class='diff-add'> if (ch === ">") {</span>&nbsp; <span class='diff-add'> state.f = state.inline = inlineNormal;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span>&nbsp; <span class='diff-add'> var type = getType(state);</span>&nbsp; <span class='diff-add'> if (type){</span>&nbsp; <span class='diff-add'> type += " ";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> type = "";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return type + linkinline;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> stream.match(/^[^>]+/, true);</span>&nbsp; <span class='diff-add'> return linkinline;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function linkHref(stream, state) {</span>&nbsp; <span class='diff-add'> // Check if space, and return NULL if so (to avoid marking the space)</span>&nbsp; <span class='diff-add'> if(stream.eatSpace()){</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var ch = stream.next();</span>&nbsp; <span class='diff-add'> if (ch === '(' || ch === '[') {</span>&nbsp; <span class='diff-add'> state.f = state.inline = getLinkHrefInside(ch === "(" ? ")" : "]");</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link-string";</span>&nbsp; <span class='diff-add'> state.linkHref = true;</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return 'error';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function getLinkHrefInside(endChar) {</span>&nbsp; <span class='diff-add'> return function(stream, state) {</span>&nbsp; <span class='diff-add'> var ch = stream.next();</span>&nbsp; <span class='diff-add'> if (ch === endChar) {</span>&nbsp; <span class='diff-add'> state.f = state.inline = inlineNormal;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link-string";</span>&nbsp; <span class='diff-add'> var returnState = getType(state);</span>&nbsp; <span class='diff-add'> state.linkHref = false;</span>&nbsp; <span class='diff-add'> return returnState;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (stream.match(inlineRE(endChar), true)) {</span>&nbsp; <span class='diff-add'> stream.backUp(1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> state.linkHref = true;</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function footnoteLink(stream, state) {</span>&nbsp; <span class='diff-add'> if (stream.match(/^[^\]]*\]:/, false)) {</span>&nbsp; <span class='diff-add'> state.f = footnoteLinkInside;</span>&nbsp; <span class='diff-add'> stream.next(); // Consume [</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span>&nbsp; <span class='diff-add'> state.linkText = true;</span>&nbsp; <span class='diff-add'> return getType(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return switchInline(stream, state, inlineNormal);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function footnoteLinkInside(stream, state) {</span>&nbsp; <span class='diff-add'> if (stream.match(/^\]:/, true)) {</span>&nbsp; <span class='diff-add'> state.f = state.inline = footnoteUrl;</span>&nbsp; <span class='diff-add'> if (modeCfg.highlightFormatting) state.formatting = "link";</span>&nbsp; <span class='diff-add'> var returnType = getType(state);</span>&nbsp; <span class='diff-add'> state.linkText = false;</span>&nbsp; <span class='diff-add'> return returnType;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> stream.match(/^[^\]]+/, true);</span>&nbsp; <span class='diff-add'> return linktext;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function footnoteUrl(stream, state) {</span>&nbsp; <span class='diff-add'> // Check if space, and return NULL if so (to avoid marking the space)</span>&nbsp; <span class='diff-add'> if(stream.eatSpace()){</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Match URL</span>&nbsp; <span class='diff-add'> stream.match(/^[^\s]+/, true);</span>&nbsp; <span class='diff-add'> // Check for link title</span>&nbsp; <span class='diff-add'> if (stream.peek() === undefined) { // End of line, set flag to check next line</span>&nbsp; <span class='diff-add'> state.linkTitle = true;</span>&nbsp; <span class='diff-add'> } else { // More content on line, check if link title</span>&nbsp; <span class='diff-add'> stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> state.f = state.inline = inlineNormal;</span>&nbsp; <span class='diff-add'> return linkhref;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var savedInlineRE = [];</span>&nbsp; <span class='diff-add'> function inlineRE(endChar) {</span>&nbsp; <span class='diff-add'> if (!savedInlineRE[endChar]) {</span>&nbsp; <span class='diff-add'> // Escape endChar for RegExp (taken from http://stackoverflow.com/a/494122/526741)</span>&nbsp; <span class='diff-add'> endChar = (endChar+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");</span>&nbsp; <span class='diff-add'> // Match any non-endChar, escaped character, as well as the closing</span>&nbsp; <span class='diff-add'> // endChar.</span>&nbsp; <span class='diff-add'> savedInlineRE[endChar] = new RegExp('^(?:[^\\\\]|\\\\.)*?(' + endChar + ')');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return savedInlineRE[endChar];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var mode = {</span>&nbsp; <span class='diff-add'> startState: function() {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> f: blockNormal,</span>&nbsp; <span class='diff-add'> prevLineHasContent: false,</span>&nbsp; <span class='diff-add'> thisLineHasContent: false,</span>&nbsp; <span class='diff-add'> block: blockNormal,</span>&nbsp; <span class='diff-add'> htmlState: null,</span>&nbsp; <span class='diff-add'> indentation: 0,</span>&nbsp; <span class='diff-add'> inline: inlineNormal,</span>&nbsp; <span class='diff-add'> text: handleText,</span>&nbsp; <span class='diff-add'> formatting: false,</span>&nbsp; <span class='diff-add'> linkText: false,</span>&nbsp; <span class='diff-add'> linkHref: false,</span>&nbsp; <span class='diff-add'> linkTitle: false,</span>&nbsp; <span class='diff-add'> em: false,</span>&nbsp; <span class='diff-add'> strong: false,</span>&nbsp; <span class='diff-add'> header: 0,</span>&nbsp; <span class='diff-add'> taskList: false,</span>&nbsp; <span class='diff-add'> list: false,</span>&nbsp; <span class='diff-add'> listDepth: 0,</span>&nbsp; <span class='diff-add'> quote: 0,</span>&nbsp; <span class='diff-add'> trailingSpace: 0,</span>&nbsp; <span class='diff-add'> trailingSpaceNewLine: false,</span>&nbsp; <span class='diff-add'> strikethrough: false</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> copyState: function(s) {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> f: s.f,</span>&nbsp; <span class='diff-add'> prevLineHasContent: s.prevLineHasContent,</span>&nbsp; <span class='diff-add'> thisLineHasContent: s.thisLineHasContent,</span>&nbsp; <span class='diff-add'> block: s.block,</span>&nbsp; <span class='diff-add'> htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState),</span>&nbsp; <span class='diff-add'> indentation: s.indentation,</span>&nbsp; <span class='diff-add'> localMode: s.localMode,</span>&nbsp; <span class='diff-add'> localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null,</span>&nbsp; <span class='diff-add'> inline: s.inline,</span>&nbsp; <span class='diff-add'> text: s.text,</span>&nbsp; <span class='diff-add'> formatting: false,</span>&nbsp; <span class='diff-add'> linkTitle: s.linkTitle,</span>&nbsp; <span class='diff-add'> em: s.em,</span>&nbsp; <span class='diff-add'> strong: s.strong,</span>&nbsp; <span class='diff-add'> strikethrough: s.strikethrough,</span>&nbsp; <span class='diff-add'> header: s.header,</span>&nbsp; <span class='diff-add'> taskList: s.taskList,</span>&nbsp; <span class='diff-add'> list: s.list,</span>&nbsp; <span class='diff-add'> listDepth: s.listDepth,</span>&nbsp; <span class='diff-add'> quote: s.quote,</span>&nbsp; <span class='diff-add'> trailingSpace: s.trailingSpace,</span>&nbsp; <span class='diff-add'> trailingSpaceNewLine: s.trailingSpaceNewLine,</span>&nbsp; <span class='diff-add'> md_inside: s.md_inside</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> token: function(stream, state) {</span>&nbsp; <span class='diff-add'> // Reset state.formatting</span>&nbsp; <span class='diff-add'> state.formatting = false;</span>&nbsp; <span class='diff-add'> if (stream.sol()) {</span>&nbsp; <span class='diff-add'> var forceBlankLine = !!state.header;</span>&nbsp; <span class='diff-add'> // Reset state.header</span>&nbsp; <span class='diff-add'> state.header = 0;</span>&nbsp; <span class='diff-add'> if (stream.match(/^\s*$/, true) || forceBlankLine) {</span>&nbsp; <span class='diff-add'> state.prevLineHasContent = false;</span>&nbsp; <span class='diff-add'> blankLine(state);</span>&nbsp; <span class='diff-add'> return forceBlankLine ? this.token(stream, state) : null;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> state.prevLineHasContent = state.thisLineHasContent;</span>&nbsp; <span class='diff-add'> state.thisLineHasContent = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Reset state.taskList</span>&nbsp; <span class='diff-add'> state.taskList = false;</span>&nbsp; <span class='diff-add'> // Reset state.code</span>&nbsp; <span class='diff-add'> state.code = false;</span>&nbsp; <span class='diff-add'> // Reset state.trailingSpace</span>&nbsp; <span class='diff-add'> state.trailingSpace = 0;</span>&nbsp; <span class='diff-add'> state.trailingSpaceNewLine = false;</span>&nbsp; <span class='diff-add'> state.f = state.block;</span>&nbsp; <span class='diff-add'> var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length;</span>&nbsp; <span class='diff-add'> var difference = Math.floor((indentation - state.indentation) / 4) * 4;</span>&nbsp; <span class='diff-add'> if (difference > 4) difference = 4;</span>&nbsp; <span class='diff-add'> var adjustedIndentation = state.indentation + difference;</span>&nbsp; <span class='diff-add'> state.indentationDiff = adjustedIndentation - state.indentation;</span>&nbsp; <span class='diff-add'> state.indentation = adjustedIndentation;</span>&nbsp; <span class='diff-add'> if (indentation > 0) return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return state.f(stream, state);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> innerMode: function(state) {</span>&nbsp; <span class='diff-add'> if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode};</span>&nbsp; <span class='diff-add'> if (state.localState) return {state: state.localState, mode: state.localMode};</span>&nbsp; <span class='diff-add'> return {state: state, mode: mode};</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> blankLine: blankLine,</span>&nbsp; <span class='diff-add'> getType: getType,</span>&nbsp; <span class='diff-add'> fold: "markdown"</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return mode;</span>&nbsp; <span class='diff-add'>}, "xml");</span>&nbsp; <span class='diff-add'>CodeMirror.defineMIME("text/x-markdown", "markdown");</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/marked.js b/ipynb/Array-feature-overlap-05_files/marked.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..e2f08c9</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/marked.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * marked - a markdown parser</span>&nbsp; <span class='diff-add'> * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)</span>&nbsp; <span class='diff-add'> * https://github.com/chjj/marked</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>;(function() {</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Block-Level Grammar</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>var block = {</span>&nbsp; <span class='diff-add'> newline: /^\n+/,</span>&nbsp; <span class='diff-add'> code: /^( {4}[^\n]+\n*)+/,</span>&nbsp; <span class='diff-add'> fences: noop,</span>&nbsp; <span class='diff-add'> hr: /^( *[-*_]){3,} *(?:\n+|$)/,</span>&nbsp; <span class='diff-add'> heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,</span>&nbsp; <span class='diff-add'> nptable: noop,</span>&nbsp; <span class='diff-add'> lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,</span>&nbsp; <span class='diff-add'> blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,</span>&nbsp; <span class='diff-add'> list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,</span>&nbsp; <span class='diff-add'> html: /^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,</span>&nbsp; <span class='diff-add'> def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,</span>&nbsp; <span class='diff-add'> table: noop,</span>&nbsp; <span class='diff-add'> paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,</span>&nbsp; <span class='diff-add'> text: /^[^\n]+/</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>block.bullet = /(?:[*+-]|\d+\.)/;</span>&nbsp; <span class='diff-add'>block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;</span>&nbsp; <span class='diff-add'>block.item = replace(block.item, 'gm')</span>&nbsp; <span class='diff-add'> (/bull/g, block.bullet)</span>&nbsp; <span class='diff-add'> ();</span>&nbsp; <span class='diff-add'>block.list = replace(block.list)</span>&nbsp; <span class='diff-add'> (/bull/g, block.bullet)</span>&nbsp; <span class='diff-add'> ('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')</span>&nbsp; <span class='diff-add'> ('def', '\\n+(?=' + block.def.source + ')')</span>&nbsp; <span class='diff-add'> ();</span>&nbsp; <span class='diff-add'>block.blockquote = replace(block.blockquote)</span>&nbsp; <span class='diff-add'> ('def', block.def)</span>&nbsp; <span class='diff-add'> ();</span>&nbsp; <span class='diff-add'>block._tag = '(?!(?:'</span>&nbsp; <span class='diff-add'> + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'</span>&nbsp; <span class='diff-add'> + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'</span>&nbsp; <span class='diff-add'> + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b';</span>&nbsp; <span class='diff-add'>block.html = replace(block.html)</span>&nbsp; <span class='diff-add'> ('comment', /<!--[\s\S]*?-->/)</span>&nbsp; <span class='diff-add'> ('closed', /<(tag)[\s\S]+?<\/\1>/)</span>&nbsp; <span class='diff-add'> ('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)</span>&nbsp; <span class='diff-add'> (/tag/g, block._tag)</span>&nbsp; <span class='diff-add'> ();</span>&nbsp; <span class='diff-add'>block.paragraph = replace(block.paragraph)</span>&nbsp; <span class='diff-add'> ('hr', block.hr)</span>&nbsp; <span class='diff-add'> ('heading', block.heading)</span>&nbsp; <span class='diff-add'> ('lheading', block.lheading)</span>&nbsp; <span class='diff-add'> ('blockquote', block.blockquote)</span>&nbsp; <span class='diff-add'> ('tag', '<' + block._tag)</span>&nbsp; <span class='diff-add'> ('def', block.def)</span>&nbsp; <span class='diff-add'> ();</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Normal Block Grammar</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>block.normal = merge({}, block);</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * GFM Block Grammar</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>block.gfm = merge({}, block.normal, {</span>&nbsp; <span class='diff-add'> fences: /^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,</span>&nbsp; <span class='diff-add'> paragraph: /^/</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='diff-add'>block.gfm.paragraph = replace(block.paragraph)</span>&nbsp; <span class='diff-add'> ('(?!', '(?!'</span>&nbsp; <span class='diff-add'> + block.gfm.fences.source.replace('\\1', '\\2') + '|'</span>&nbsp; <span class='diff-add'> + block.list.source.replace('\\1', '\\3') + '|')</span>&nbsp; <span class='diff-add'> ();</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * GFM + Tables Block Grammar</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>block.tables = merge({}, block.gfm, {</span>&nbsp; <span class='diff-add'> nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,</span>&nbsp; <span class='diff-add'> table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Block Lexer</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>function Lexer(options) {</span>&nbsp; <span class='diff-add'> this.tokens = [];</span>&nbsp; <span class='diff-add'> this.tokens.links = {};</span>&nbsp; <span class='diff-add'> this.options = options || marked.defaults;</span>&nbsp; <span class='diff-add'> this.rules = block.normal;</span>&nbsp; <span class='diff-add'> if (this.options.gfm) {</span>&nbsp; <span class='diff-add'> if (this.options.tables) {</span>&nbsp; <span class='diff-add'> this.rules = block.tables;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.rules = block.gfm;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Expose Block Rules</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>Lexer.rules = block;</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Static Lex Method</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>Lexer.lex = function(src, options) {</span>&nbsp; <span class='diff-add'> var lexer = new Lexer(options);</span>&nbsp; <span class='diff-add'> return lexer.lex(src);</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Preprocessing</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>Lexer.prototype.lex = function(src) {</span>&nbsp; <span class='diff-add'> src = src</span>&nbsp; <span class='diff-add'> .replace(/\r\n|\r/g, '\n')</span>&nbsp; <span class='diff-add'> .replace(/\t/g, ' ')</span>&nbsp; <span class='diff-add'> .replace(/\u00a0/g, ' ')</span>&nbsp; <span class='diff-add'> .replace(/\u2424/g, '\n');</span>&nbsp; <span class='diff-add'> return this.token(src, true);</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Lexing</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>Lexer.prototype.token = function(src, top, bq) {</span>&nbsp; <span class='diff-add'> var src = src.replace(/^ +$/gm, '')</span>&nbsp; <span class='diff-add'> , next</span>&nbsp; <span class='diff-add'> , loose</span>&nbsp; <span class='diff-add'> , cap</span>&nbsp; <span class='diff-add'> , bull</span>&nbsp; <span class='diff-add'> , b</span>&nbsp; <span class='diff-add'> , item</span>&nbsp; <span class='diff-add'> , space</span>&nbsp; <span class='diff-add'> , i</span>&nbsp; <span class='diff-add'> , l;</span>&nbsp; <span class='diff-add'> while (src) {</span>&nbsp; <span class='diff-add'> // newline</span>&nbsp; <span class='diff-add'> if (cap = this.rules.newline.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> if (cap[0].length > 1) {</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'space'</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // code</span>&nbsp; <span class='diff-add'> if (cap = this.rules.code.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> cap = cap[0].replace(/^ {4}/gm, '');</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'code',</span>&nbsp; <span class='diff-add'> text: !this.options.pedantic</span>&nbsp; <span class='diff-add'> ? cap.replace(/\n+$/, '')</span>&nbsp; <span class='diff-add'> : cap</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // fences (gfm)</span>&nbsp; <span class='diff-add'> if (cap = this.rules.fences.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'code',</span>&nbsp; <span class='diff-add'> lang: cap[2],</span>&nbsp; <span class='diff-add'> text: cap[3]</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // heading</span>&nbsp; <span class='diff-add'> if (cap = this.rules.heading.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'heading',</span>&nbsp; <span class='diff-add'> depth: cap[1].length,</span>&nbsp; <span class='diff-add'> text: cap[2]</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // table no leading pipe (gfm)</span>&nbsp; <span class='diff-add'> if (top && (cap = this.rules.nptable.exec(src))) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> item = {</span>&nbsp; <span class='diff-add'> type: 'table',</span>&nbsp; <span class='diff-add'> header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),</span>&nbsp; <span class='diff-add'> align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),</span>&nbsp; <span class='diff-add'> cells: cap[3].replace(/\n$/, '').split('\n')</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> for (i = 0; i < item.align.length; i++) {</span>&nbsp; <span class='diff-add'> if (/^ *-+: *$/.test(item.align[i])) {</span>&nbsp; <span class='diff-add'> item.align[i] = 'right';</span>&nbsp; <span class='diff-add'> } else if (/^ *:-+: *$/.test(item.align[i])) {</span>&nbsp; <span class='diff-add'> item.align[i] = 'center';</span>&nbsp; <span class='diff-add'> } else if (/^ *:-+ *$/.test(item.align[i])) {</span>&nbsp; <span class='diff-add'> item.align[i] = 'left';</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> item.align[i] = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (i = 0; i < item.cells.length; i++) {</span>&nbsp; <span class='diff-add'> item.cells[i] = item.cells[i].split(/ *\| */);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.tokens.push(item);</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // lheading</span>&nbsp; <span class='diff-add'> if (cap = this.rules.lheading.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'heading',</span>&nbsp; <span class='diff-add'> depth: cap[2] === '=' ? 1 : 2,</span>&nbsp; <span class='diff-add'> text: cap[1]</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // hr</span>&nbsp; <span class='diff-add'> if (cap = this.rules.hr.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'hr'</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // blockquote</span>&nbsp; <span class='diff-add'> if (cap = this.rules.blockquote.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'blockquote_start'</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> cap = cap[0].replace(/^ *> ?/gm, '');</span>&nbsp; <span class='diff-add'> // Pass `top` to keep the current</span>&nbsp; <span class='diff-add'> // "toplevel" state. This is exactly</span>&nbsp; <span class='diff-add'> // how markdown.pl works.</span>&nbsp; <span class='diff-add'> this.token(cap, top, true);</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'blockquote_end'</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // list</span>&nbsp; <span class='diff-add'> if (cap = this.rules.list.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> bull = cap[2];</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'list_start',</span>&nbsp; <span class='diff-add'> ordered: bull.length > 1</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Get each top-level item.</span>&nbsp; <span class='diff-add'> cap = cap[0].match(this.rules.item);</span>&nbsp; <span class='diff-add'> next = false;</span>&nbsp; <span class='diff-add'> l = cap.length;</span>&nbsp; <span class='diff-add'> i = 0;</span>&nbsp; <span class='diff-add'> for (; i < l; i++) {</span>&nbsp; <span class='diff-add'> item = cap[i];</span>&nbsp; <span class='diff-add'> // Remove the list item's bullet</span>&nbsp; <span class='diff-add'> // so it is seen as the next token.</span>&nbsp; <span class='diff-add'> space = item.length;</span>&nbsp; <span class='diff-add'> item = item.replace(/^ *([*+-]|\d+\.) +/, '');</span>&nbsp; <span class='diff-add'> // Outdent whatever the</span>&nbsp; <span class='diff-add'> // list item contains. Hacky.</span>&nbsp; <span class='diff-add'> if (~item.indexOf('\n ')) {</span>&nbsp; <span class='diff-add'> space -= item.length;</span>&nbsp; <span class='diff-add'> item = !this.options.pedantic</span>&nbsp; <span class='diff-add'> ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')</span>&nbsp; <span class='diff-add'> : item.replace(/^ {1,4}/gm, '');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Determine whether the next list item belongs here.</span>&nbsp; <span class='diff-add'> // Backpedal if it does not belong in this list.</span>&nbsp; <span class='diff-add'> if (this.options.smartLists && i !== l - 1) {</span>&nbsp; <span class='diff-add'> b = block.bullet.exec(cap[i + 1])[0];</span>&nbsp; <span class='diff-add'> if (bull !== b && !(bull.length > 1 && b.length > 1)) {</span>&nbsp; <span class='diff-add'> src = cap.slice(i + 1).join('\n') + src;</span>&nbsp; <span class='diff-add'> i = l - 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Determine whether item is loose or not.</span>&nbsp; <span class='diff-add'> // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/</span>&nbsp; <span class='diff-add'> // for discount behavior.</span>&nbsp; <span class='diff-add'> loose = next || /\n\n(?!\s*$)/.test(item);</span>&nbsp; <span class='diff-add'> if (i !== l - 1) {</span>&nbsp; <span class='diff-add'> next = item.charAt(item.length - 1) === '\n';</span>&nbsp; <span class='diff-add'> if (!loose) loose = next;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: loose</span>&nbsp; <span class='diff-add'> ? 'loose_item_start'</span>&nbsp; <span class='diff-add'> : 'list_item_start'</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Recurse.</span>&nbsp; <span class='diff-add'> this.token(item, false, bq);</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'list_item_end'</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'list_end'</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // html</span>&nbsp; <span class='diff-add'> if (cap = this.rules.html.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: this.options.sanitize</span>&nbsp; <span class='diff-add'> ? 'paragraph'</span>&nbsp; <span class='diff-add'> : 'html',</span>&nbsp; <span class='diff-add'> pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',</span>&nbsp; <span class='diff-add'> text: cap[0]</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // def</span>&nbsp; <span class='diff-add'> if ((!bq && top) && (cap = this.rules.def.exec(src))) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> this.tokens.links[cap[1].toLowerCase()] = {</span>&nbsp; <span class='diff-add'> href: cap[2],</span>&nbsp; <span class='diff-add'> title: cap[3]</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // table (gfm)</span>&nbsp; <span class='diff-add'> if (top && (cap = this.rules.table.exec(src))) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> item = {</span>&nbsp; <span class='diff-add'> type: 'table',</span>&nbsp; <span class='diff-add'> header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),</span>&nbsp; <span class='diff-add'> align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),</span>&nbsp; <span class='diff-add'> cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> for (i = 0; i < item.align.length; i++) {</span>&nbsp; <span class='diff-add'> if (/^ *-+: *$/.test(item.align[i])) {</span>&nbsp; <span class='diff-add'> item.align[i] = 'right';</span>&nbsp; <span class='diff-add'> } else if (/^ *:-+: *$/.test(item.align[i])) {</span>&nbsp; <span class='diff-add'> item.align[i] = 'center';</span>&nbsp; <span class='diff-add'> } else if (/^ *:-+ *$/.test(item.align[i])) {</span>&nbsp; <span class='diff-add'> item.align[i] = 'left';</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> item.align[i] = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (i = 0; i < item.cells.length; i++) {</span>&nbsp; <span class='diff-add'> item.cells[i] = item.cells[i]</span>&nbsp; <span class='diff-add'> .replace(/^ *\| *| *\| *$/g, '')</span>&nbsp; <span class='diff-add'> .split(/ *\| */);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.tokens.push(item);</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // top-level paragraph</span>&nbsp; <span class='diff-add'> if (top && (cap = this.rules.paragraph.exec(src))) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'paragraph',</span>&nbsp; <span class='diff-add'> text: cap[1].charAt(cap[1].length - 1) === '\n'</span>&nbsp; <span class='diff-add'> ? cap[1].slice(0, -1)</span>&nbsp; <span class='diff-add'> : cap[1]</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // text</span>&nbsp; <span class='diff-add'> if (cap = this.rules.text.exec(src)) {</span>&nbsp; <span class='diff-add'> // Top-level should never reach here.</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> this.tokens.push({</span>&nbsp; <span class='diff-add'> type: 'text',</span>&nbsp; <span class='diff-add'> text: cap[0]</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (src) {</span>&nbsp; <span class='diff-add'> throw new</span>&nbsp; <span class='diff-add'> Error('Infinite loop on byte: ' + src.charCodeAt(0));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.tokens;</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Inline-Level Grammar</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>var inline = {</span>&nbsp; <span class='diff-add'> escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,</span>&nbsp; <span class='diff-add'> autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,</span>&nbsp; <span class='diff-add'> url: noop,</span>&nbsp; <span class='diff-add'> tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,</span>&nbsp; <span class='diff-add'> link: /^!?\[(inside)\]\(href\)/,</span>&nbsp; <span class='diff-add'> reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,</span>&nbsp; <span class='diff-add'> nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,</span>&nbsp; <span class='diff-add'> strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,</span>&nbsp; <span class='diff-add'> em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,</span>&nbsp; <span class='diff-add'> code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,</span>&nbsp; <span class='diff-add'> br: /^ {2,}\n(?!\s*$)/,</span>&nbsp; <span class='diff-add'> del: noop,</span>&nbsp; <span class='diff-add'> text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>inline._inside = /(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;</span>&nbsp; <span class='diff-add'>inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;</span>&nbsp; <span class='diff-add'>inline.link = replace(inline.link)</span>&nbsp; <span class='diff-add'> ('inside', inline._inside)</span>&nbsp; <span class='diff-add'> ('href', inline._href)</span>&nbsp; <span class='diff-add'> ();</span>&nbsp; <span class='diff-add'>inline.reflink = replace(inline.reflink)</span>&nbsp; <span class='diff-add'> ('inside', inline._inside)</span>&nbsp; <span class='diff-add'> ();</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Normal Inline Grammar</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>inline.normal = merge({}, inline);</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Pedantic Inline Grammar</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>inline.pedantic = merge({}, inline.normal, {</span>&nbsp; <span class='diff-add'> strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,</span>&nbsp; <span class='diff-add'> em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * GFM Inline Grammar</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>inline.gfm = merge({}, inline.normal, {</span>&nbsp; <span class='diff-add'> escape: replace(inline.escape)('])', '~|])')(),</span>&nbsp; <span class='diff-add'> url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,</span>&nbsp; <span class='diff-add'> del: /^~~(?=\S)([\s\S]*?\S)~~/,</span>&nbsp; <span class='diff-add'> text: replace(inline.text)</span>&nbsp; <span class='diff-add'> (']|', '~]|')</span>&nbsp; <span class='diff-add'> ('|', '|https?://|')</span>&nbsp; <span class='diff-add'> ()</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * GFM + Line Breaks Inline Grammar</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>inline.breaks = merge({}, inline.gfm, {</span>&nbsp; <span class='diff-add'> br: replace(inline.br)('{2,}', '*')(),</span>&nbsp; <span class='diff-add'> text: replace(inline.gfm.text)('{2,}', '*')()</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Inline Lexer & Compiler</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>function InlineLexer(links, options) {</span>&nbsp; <span class='diff-add'> this.options = options || marked.defaults;</span>&nbsp; <span class='diff-add'> this.links = links;</span>&nbsp; <span class='diff-add'> this.rules = inline.normal;</span>&nbsp; <span class='diff-add'> this.renderer = this.options.renderer || new Renderer;</span>&nbsp; <span class='diff-add'> this.renderer.options = this.options;</span>&nbsp; <span class='diff-add'> if (!this.links) {</span>&nbsp; <span class='diff-add'> throw new</span>&nbsp; <span class='diff-add'> Error('Tokens array requires a `links` property.');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.options.gfm) {</span>&nbsp; <span class='diff-add'> if (this.options.breaks) {</span>&nbsp; <span class='diff-add'> this.rules = inline.breaks;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.rules = inline.gfm;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (this.options.pedantic) {</span>&nbsp; <span class='diff-add'> this.rules = inline.pedantic;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Expose Inline Rules</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>InlineLexer.rules = inline;</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Static Lexing/Compiling Method</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>InlineLexer.output = function(src, links, options) {</span>&nbsp; <span class='diff-add'> var inline = new InlineLexer(links, options);</span>&nbsp; <span class='diff-add'> return inline.output(src);</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Lexing/Compiling</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>InlineLexer.prototype.output = function(src) {</span>&nbsp; <span class='diff-add'> var out = ''</span>&nbsp; <span class='diff-add'> , link</span>&nbsp; <span class='diff-add'> , text</span>&nbsp; <span class='diff-add'> , href</span>&nbsp; <span class='diff-add'> , cap;</span>&nbsp; <span class='diff-add'> while (src) {</span>&nbsp; <span class='diff-add'> // escape</span>&nbsp; <span class='diff-add'> if (cap = this.rules.escape.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> out += cap[1];</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // autolink</span>&nbsp; <span class='diff-add'> if (cap = this.rules.autolink.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> if (cap[2] === '@') {</span>&nbsp; <span class='diff-add'> text = cap[1].charAt(6) === ':'</span>&nbsp; <span class='diff-add'> ? this.mangle(cap[1].substring(7))</span>&nbsp; <span class='diff-add'> : this.mangle(cap[1]);</span>&nbsp; <span class='diff-add'> href = this.mangle('mailto:') + text;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> text = escape(cap[1]);</span>&nbsp; <span class='diff-add'> href = text;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> out += this.renderer.link(href, null, text);</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // url (gfm)</span>&nbsp; <span class='diff-add'> if (!this.inLink && (cap = this.rules.url.exec(src))) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> text = escape(cap[1]);</span>&nbsp; <span class='diff-add'> href = text;</span>&nbsp; <span class='diff-add'> out += this.renderer.link(href, null, text);</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // tag</span>&nbsp; <span class='diff-add'> if (cap = this.rules.tag.exec(src)) {</span>&nbsp; <span class='diff-add'> if (!this.inLink && /^<a /i.test(cap[0])) {</span>&nbsp; <span class='diff-add'> this.inLink = true;</span>&nbsp; <span class='diff-add'> } else if (this.inLink && /^<\/a>/i.test(cap[0])) {</span>&nbsp; <span class='diff-add'> this.inLink = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> out += this.options.sanitize</span>&nbsp; <span class='diff-add'> ? escape(cap[0])</span>&nbsp; <span class='diff-add'> : cap[0];</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // link</span>&nbsp; <span class='diff-add'> if (cap = this.rules.link.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> this.inLink = true;</span>&nbsp; <span class='diff-add'> out += this.outputLink(cap, {</span>&nbsp; <span class='diff-add'> href: cap[2],</span>&nbsp; <span class='diff-add'> title: cap[3]</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.inLink = false;</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // reflink, nolink</span>&nbsp; <span class='diff-add'> if ((cap = this.rules.reflink.exec(src))</span>&nbsp; <span class='diff-add'> || (cap = this.rules.nolink.exec(src))) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> link = (cap[2] || cap[1]).replace(/\s+/g, ' ');</span>&nbsp; <span class='diff-add'> link = this.links[link.toLowerCase()];</span>&nbsp; <span class='diff-add'> if (!link || !link.href) {</span>&nbsp; <span class='diff-add'> out += cap[0].charAt(0);</span>&nbsp; <span class='diff-add'> src = cap[0].substring(1) + src;</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.inLink = true;</span>&nbsp; <span class='diff-add'> out += this.outputLink(cap, link);</span>&nbsp; <span class='diff-add'> this.inLink = false;</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // strong</span>&nbsp; <span class='diff-add'> if (cap = this.rules.strong.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> out += this.renderer.strong(this.output(cap[2] || cap[1]));</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // em</span>&nbsp; <span class='diff-add'> if (cap = this.rules.em.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> out += this.renderer.em(this.output(cap[2] || cap[1]));</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // code</span>&nbsp; <span class='diff-add'> if (cap = this.rules.code.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> out += this.renderer.codespan(escape(cap[2], true));</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // br</span>&nbsp; <span class='diff-add'> if (cap = this.rules.br.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> out += this.renderer.br();</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // del (gfm)</span>&nbsp; <span class='diff-add'> if (cap = this.rules.del.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> out += this.renderer.del(this.output(cap[1]));</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // text</span>&nbsp; <span class='diff-add'> if (cap = this.rules.text.exec(src)) {</span>&nbsp; <span class='diff-add'> src = src.substring(cap[0].length);</span>&nbsp; <span class='diff-add'> out += escape(this.smartypants(cap[0]));</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (src) {</span>&nbsp; <span class='diff-add'> throw new</span>&nbsp; <span class='diff-add'> Error('Infinite loop on byte: ' + src.charCodeAt(0));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return out;</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Compile Link</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>InlineLexer.prototype.outputLink = function(cap, link) {</span>&nbsp; <span class='diff-add'> var href = escape(link.href)</span>&nbsp; <span class='diff-add'> , title = link.title ? escape(link.title) : null;</span>&nbsp; <span class='diff-add'> return cap[0].charAt(0) !== '!'</span>&nbsp; <span class='diff-add'> ? this.renderer.link(href, title, this.output(cap[1]))</span>&nbsp; <span class='diff-add'> : this.renderer.image(href, title, escape(cap[1]));</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Smartypants Transformations</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>InlineLexer.prototype.smartypants = function(text) {</span>&nbsp; <span class='diff-add'> if (!this.options.smartypants) return text;</span>&nbsp; <span class='diff-add'> return text</span>&nbsp; <span class='diff-add'> // em-dashes</span>&nbsp; <span class='diff-add'> .replace(/--/g, '\u2014')</span>&nbsp; <span class='diff-add'> // opening singles</span>&nbsp; <span class='diff-add'> .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')</span>&nbsp; <span class='diff-add'> // closing singles & apostrophes</span>&nbsp; <span class='diff-add'> .replace(/'/g, '\u2019')</span>&nbsp; <span class='diff-add'> // opening doubles</span>&nbsp; <span class='diff-add'> .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')</span>&nbsp; <span class='diff-add'> // closing doubles</span>&nbsp; <span class='diff-add'> .replace(/"/g, '\u201d')</span>&nbsp; <span class='diff-add'> // ellipses</span>&nbsp; <span class='diff-add'> .replace(/\.{3}/g, '\u2026');</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Mangle Links</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>InlineLexer.prototype.mangle = function(text) {</span>&nbsp; <span class='diff-add'> var out = ''</span>&nbsp; <span class='diff-add'> , l = text.length</span>&nbsp; <span class='diff-add'> , i = 0</span>&nbsp; <span class='diff-add'> , ch;</span>&nbsp; <span class='diff-add'> for (; i < l; i++) {</span>&nbsp; <span class='diff-add'> ch = text.charCodeAt(i);</span>&nbsp; <span class='diff-add'> if (Math.random() > 0.5) {</span>&nbsp; <span class='diff-add'> ch = 'x' + ch.toString(16);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> out += '&#' + ch + ';';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return out;</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Renderer</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>function Renderer(options) {</span>&nbsp; <span class='diff-add'> this.options = options || {};</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='diff-add'>Renderer.prototype.code = function(code, lang, escaped) {</span>&nbsp; <span class='diff-add'> if (this.options.highlight) {</span>&nbsp; <span class='diff-add'> var out = this.options.highlight(code, lang);</span>&nbsp; <span class='diff-add'> if (out != null && out !== code) {</span>&nbsp; <span class='diff-add'> escaped = true;</span>&nbsp; <span class='diff-add'> code = out;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!lang) {</span>&nbsp; <span class='diff-add'> return '<pre><code>'</span>&nbsp; <span class='diff-add'> + (escaped ? code : escape(code, true))</span>&nbsp; <span class='diff-add'> + '\n</code></pre>';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return '<pre><code class="'</span>&nbsp; <span class='diff-add'> + this.options.langPrefix</span>&nbsp; <span class='diff-add'> + escape(lang, true)</span>&nbsp; <span class='diff-add'> + '">'</span>&nbsp; <span class='diff-add'> + (escaped ? code : escape(code, true))</span>&nbsp; <span class='diff-add'> + '\n</code></pre>\n';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.blockquote = function(quote) {</span>&nbsp; <span class='diff-add'> return '<blockquote>\n' + quote + '</blockquote>\n';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.html = function(html) {</span>&nbsp; <span class='diff-add'> return html;</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.heading = function(text, level, raw) {</span>&nbsp; <span class='diff-add'> return '<h'</span>&nbsp; <span class='diff-add'> + level</span>&nbsp; <span class='diff-add'> + ' id="'</span>&nbsp; <span class='diff-add'> + this.options.headerPrefix</span>&nbsp; <span class='diff-add'> + raw.toLowerCase().replace(/[^\w]+/g, '-')</span>&nbsp; <span class='diff-add'> + '">'</span>&nbsp; <span class='diff-add'> + text</span>&nbsp; <span class='diff-add'> + '</h'</span>&nbsp; <span class='diff-add'> + level</span>&nbsp; <span class='diff-add'> + '>\n';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.hr = function() {</span>&nbsp; <span class='diff-add'> return this.options.xhtml ? '<hr/>\n' : '<hr>\n';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.list = function(body, ordered) {</span>&nbsp; <span class='diff-add'> var type = ordered ? 'ol' : 'ul';</span>&nbsp; <span class='diff-add'> return '<' + type + '>\n' + body + '</' + type + '>\n';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.listitem = function(text) {</span>&nbsp; <span class='diff-add'> return '<li>' + text + '</li>\n';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.paragraph = function(text) {</span>&nbsp; <span class='diff-add'> return '<p>' + text + '</p>\n';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.table = function(header, body) {</span>&nbsp; <span class='diff-add'> return '<table>\n'</span>&nbsp; <span class='diff-add'> + '<thead>\n'</span>&nbsp; <span class='diff-add'> + header</span>&nbsp; <span class='diff-add'> + '</thead>\n'</span>&nbsp; <span class='diff-add'> + '<tbody>\n'</span>&nbsp; <span class='diff-add'> + body</span>&nbsp; <span class='diff-add'> + '</tbody>\n'</span>&nbsp; <span class='diff-add'> + '</table>\n';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.tablerow = function(content) {</span>&nbsp; <span class='diff-add'> return '<tr>\n' + content + '</tr>\n';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.tablecell = function(content, flags) {</span>&nbsp; <span class='diff-add'> var type = flags.header ? 'th' : 'td';</span>&nbsp; <span class='diff-add'> var tag = flags.align</span>&nbsp; <span class='diff-add'> ? '<' + type + ' style="text-align:' + flags.align + '">'</span>&nbsp; <span class='diff-add'> : '<' + type + '>';</span>&nbsp; <span class='diff-add'> return tag + content + '</' + type + '>\n';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>// span level renderer</span>&nbsp; <span class='diff-add'>Renderer.prototype.strong = function(text) {</span>&nbsp; <span class='diff-add'> return '<strong>' + text + '</strong>';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.em = function(text) {</span>&nbsp; <span class='diff-add'> return '<em>' + text + '</em>';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.codespan = function(text) {</span>&nbsp; <span class='diff-add'> return '<code>' + text + '</code>';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.br = function() {</span>&nbsp; <span class='diff-add'> return this.options.xhtml ? '<br/>' : '<br>';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.del = function(text) {</span>&nbsp; <span class='diff-add'> return '<del>' + text + '</del>';</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.link = function(href, title, text) {</span>&nbsp; <span class='diff-add'> if (this.options.sanitize) {</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> var prot = decodeURIComponent(unescape(href))</span>&nbsp; <span class='diff-add'> .replace(/[^\w:]/g, '')</span>&nbsp; <span class='diff-add'> .toLowerCase();</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> return '';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (prot.indexOf('javascript:') === 0) {</span>&nbsp; <span class='diff-add'> return '';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var out = '<a href="' + href + '"';</span>&nbsp; <span class='diff-add'> if (title) {</span>&nbsp; <span class='diff-add'> out += ' title="' + title + '"';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> out += '>' + text + '</a>';</span>&nbsp; <span class='diff-add'> return out;</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>Renderer.prototype.image = function(href, title, text) {</span>&nbsp; <span class='diff-add'> var out = '<img src="' + href + '" alt="' + text + '"';</span>&nbsp; <span class='diff-add'> if (title) {</span>&nbsp; <span class='diff-add'> out += ' title="' + title + '"';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> out += this.options.xhtml ? '/>' : '>';</span>&nbsp; <span class='diff-add'> return out;</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Parsing & Compiling</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>function Parser(options) {</span>&nbsp; <span class='diff-add'> this.tokens = [];</span>&nbsp; <span class='diff-add'> this.token = null;</span>&nbsp; <span class='diff-add'> this.options = options || marked.defaults;</span>&nbsp; <span class='diff-add'> this.options.renderer = this.options.renderer || new Renderer;</span>&nbsp; <span class='diff-add'> this.renderer = this.options.renderer;</span>&nbsp; <span class='diff-add'> this.renderer.options = this.options;</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Static Parse Method</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>Parser.parse = function(src, options, renderer) {</span>&nbsp; <span class='diff-add'> var parser = new Parser(options, renderer);</span>&nbsp; <span class='diff-add'> return parser.parse(src);</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Parse Loop</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>Parser.prototype.parse = function(src) {</span>&nbsp; <span class='diff-add'> this.inline = new InlineLexer(src.links, this.options, this.renderer);</span>&nbsp; <span class='diff-add'> this.tokens = src.reverse();</span>&nbsp; <span class='diff-add'> var out = '';</span>&nbsp; <span class='diff-add'> while (this.next()) {</span>&nbsp; <span class='diff-add'> out += this.tok();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return out;</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Next Token</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>Parser.prototype.next = function() {</span>&nbsp; <span class='diff-add'> return this.token = this.tokens.pop();</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Preview Next Token</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>Parser.prototype.peek = function() {</span>&nbsp; <span class='diff-add'> return this.tokens[this.tokens.length - 1] || 0;</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Parse Text Tokens</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>Parser.prototype.parseText = function() {</span>&nbsp; <span class='diff-add'> var body = this.token.text;</span>&nbsp; <span class='diff-add'> while (this.peek().type === 'text') {</span>&nbsp; <span class='diff-add'> body += '\n' + this.next().text;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.inline.output(body);</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Parse Current Token</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>Parser.prototype.tok = function() {</span>&nbsp; <span class='diff-add'> switch (this.token.type) {</span>&nbsp; <span class='diff-add'> case 'space': {</span>&nbsp; <span class='diff-add'> return '';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> case 'hr': {</span>&nbsp; <span class='diff-add'> return this.renderer.hr();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> case 'heading': {</span>&nbsp; <span class='diff-add'> return this.renderer.heading(</span>&nbsp; <span class='diff-add'> this.inline.output(this.token.text),</span>&nbsp; <span class='diff-add'> this.token.depth,</span>&nbsp; <span class='diff-add'> this.token.text);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> case 'code': {</span>&nbsp; <span class='diff-add'> return this.renderer.code(this.token.text,</span>&nbsp; <span class='diff-add'> this.token.lang,</span>&nbsp; <span class='diff-add'> this.token.escaped);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> case 'table': {</span>&nbsp; <span class='diff-add'> var header = ''</span>&nbsp; <span class='diff-add'> , body = ''</span>&nbsp; <span class='diff-add'> , i</span>&nbsp; <span class='diff-add'> , row</span>&nbsp; <span class='diff-add'> , cell</span>&nbsp; <span class='diff-add'> , flags</span>&nbsp; <span class='diff-add'> , j;</span>&nbsp; <span class='diff-add'> // header</span>&nbsp; <span class='diff-add'> cell = '';</span>&nbsp; <span class='diff-add'> for (i = 0; i < this.token.header.length; i++) {</span>&nbsp; <span class='diff-add'> flags = { header: true, align: this.token.align[i] };</span>&nbsp; <span class='diff-add'> cell += this.renderer.tablecell(</span>&nbsp; <span class='diff-add'> this.inline.output(this.token.header[i]),</span>&nbsp; <span class='diff-add'> { header: true, align: this.token.align[i] }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> header += this.renderer.tablerow(cell);</span>&nbsp; <span class='diff-add'> for (i = 0; i < this.token.cells.length; i++) {</span>&nbsp; <span class='diff-add'> row = this.token.cells[i];</span>&nbsp; <span class='diff-add'> cell = '';</span>&nbsp; <span class='diff-add'> for (j = 0; j < row.length; j++) {</span>&nbsp; <span class='diff-add'> cell += this.renderer.tablecell(</span>&nbsp; <span class='diff-add'> this.inline.output(row[j]),</span>&nbsp; <span class='diff-add'> { header: false, align: this.token.align[j] }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> body += this.renderer.tablerow(cell);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.renderer.table(header, body);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> case 'blockquote_start': {</span>&nbsp; <span class='diff-add'> var body = '';</span>&nbsp; <span class='diff-add'> while (this.next().type !== 'blockquote_end') {</span>&nbsp; <span class='diff-add'> body += this.tok();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.renderer.blockquote(body);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> case 'list_start': {</span>&nbsp; <span class='diff-add'> var body = ''</span>&nbsp; <span class='diff-add'> , ordered = this.token.ordered;</span>&nbsp; <span class='diff-add'> while (this.next().type !== 'list_end') {</span>&nbsp; <span class='diff-add'> body += this.tok();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.renderer.list(body, ordered);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> case 'list_item_start': {</span>&nbsp; <span class='diff-add'> var body = '';</span>&nbsp; <span class='diff-add'> while (this.next().type !== 'list_item_end') {</span>&nbsp; <span class='diff-add'> body += this.token.type === 'text'</span>&nbsp; <span class='diff-add'> ? this.parseText()</span>&nbsp; <span class='diff-add'> : this.tok();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.renderer.listitem(body);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> case 'loose_item_start': {</span>&nbsp; <span class='diff-add'> var body = '';</span>&nbsp; <span class='diff-add'> while (this.next().type !== 'list_item_end') {</span>&nbsp; <span class='diff-add'> body += this.tok();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.renderer.listitem(body);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> case 'html': {</span>&nbsp; <span class='diff-add'> var html = !this.token.pre && !this.options.pedantic</span>&nbsp; <span class='diff-add'> ? this.inline.output(this.token.text)</span>&nbsp; <span class='diff-add'> : this.token.text;</span>&nbsp; <span class='diff-add'> return this.renderer.html(html);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> case 'paragraph': {</span>&nbsp; <span class='diff-add'> return this.renderer.paragraph(this.inline.output(this.token.text));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> case 'text': {</span>&nbsp; <span class='diff-add'> return this.renderer.paragraph(this.parseText());</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Helpers</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>function escape(html, encode) {</span>&nbsp; <span class='diff-add'> return html</span>&nbsp; <span class='diff-add'> .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')</span>&nbsp; <span class='diff-add'> .replace(/</g, '&lt;')</span>&nbsp; <span class='diff-add'> .replace(/>/g, '&gt;')</span>&nbsp; <span class='diff-add'> .replace(/"/g, '&quot;')</span>&nbsp; <span class='diff-add'> .replace(/'/g, '&#39;');</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='diff-add'>function unescape(html) {</span>&nbsp; <span class='diff-add'> return html.replace(/&([#\w]+);/g, function(_, n) {</span>&nbsp; <span class='diff-add'> n = n.toLowerCase();</span>&nbsp; <span class='diff-add'> if (n === 'colon') return ':';</span>&nbsp; <span class='diff-add'> if (n.charAt(0) === '#') {</span>&nbsp; <span class='diff-add'> return n.charAt(1) === 'x'</span>&nbsp; <span class='diff-add'> ? String.fromCharCode(parseInt(n.substring(2), 16))</span>&nbsp; <span class='diff-add'> : String.fromCharCode(+n.substring(1));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return '';</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='diff-add'>function replace(regex, opt) {</span>&nbsp; <span class='diff-add'> regex = regex.source;</span>&nbsp; <span class='diff-add'> opt = opt || '';</span>&nbsp; <span class='diff-add'> return function self(name, val) {</span>&nbsp; <span class='diff-add'> if (!name) return new RegExp(regex, opt);</span>&nbsp; <span class='diff-add'> val = val.source || val;</span>&nbsp; <span class='diff-add'> val = val.replace(/(^|[^\[])\^/g, '$1');</span>&nbsp; <span class='diff-add'> regex = regex.replace(name, val);</span>&nbsp; <span class='diff-add'> return self;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='diff-add'>function noop() {}</span>&nbsp; <span class='diff-add'>noop.exec = noop;</span>&nbsp; <span class='diff-add'>function merge(obj) {</span>&nbsp; <span class='diff-add'> var i = 1</span>&nbsp; <span class='diff-add'> , target</span>&nbsp; <span class='diff-add'> , key;</span>&nbsp; <span class='diff-add'> for (; i < arguments.length; i++) {</span>&nbsp; <span class='diff-add'> target = arguments[i];</span>&nbsp; <span class='diff-add'> for (key in target) {</span>&nbsp; <span class='diff-add'> if (Object.prototype.hasOwnProperty.call(target, key)) {</span>&nbsp; <span class='diff-add'> obj[key] = target[key];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return obj;</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Marked</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>function marked(src, opt, callback) {</span>&nbsp; <span class='diff-add'> if (callback || typeof opt === 'function') {</span>&nbsp; <span class='diff-add'> if (!callback) {</span>&nbsp; <span class='diff-add'> callback = opt;</span>&nbsp; <span class='diff-add'> opt = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> opt = merge({}, marked.defaults, opt || {});</span>&nbsp; <span class='diff-add'> var highlight = opt.highlight</span>&nbsp; <span class='diff-add'> , tokens</span>&nbsp; <span class='diff-add'> , pending</span>&nbsp; <span class='diff-add'> , i = 0;</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> tokens = Lexer.lex(src, opt)</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> return callback(e);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> pending = tokens.length;</span>&nbsp; <span class='diff-add'> var done = function() {</span>&nbsp; <span class='diff-add'> var out, err;</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> out = Parser.parse(tokens, opt);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> err = e;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> opt.highlight = highlight;</span>&nbsp; <span class='diff-add'> return err</span>&nbsp; <span class='diff-add'> ? callback(err)</span>&nbsp; <span class='diff-add'> : callback(null, out);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (!highlight || highlight.length < 3) {</span>&nbsp; <span class='diff-add'> return done();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> delete opt.highlight;</span>&nbsp; <span class='diff-add'> if (!pending) return done();</span>&nbsp; <span class='diff-add'> for (; i < tokens.length; i++) {</span>&nbsp; <span class='diff-add'> (function(token) {</span>&nbsp; <span class='diff-add'> if (token.type !== 'code') {</span>&nbsp; <span class='diff-add'> return --pending || done();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return highlight(token.text, token.lang, function(err, code) {</span>&nbsp; <span class='diff-add'> if (code == null || code === token.text) {</span>&nbsp; <span class='diff-add'> return --pending || done();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> token.text = code;</span>&nbsp; <span class='diff-add'> token.escaped = true;</span>&nbsp; <span class='diff-add'> --pending || done();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> })(tokens[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> if (opt) opt = merge({}, marked.defaults, opt);</span>&nbsp; <span class='diff-add'> return Parser.parse(Lexer.lex(src, opt), opt);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> e.message += '\nPlease report this to https://github.com/chjj/marked.';</span>&nbsp; <span class='diff-add'> if ((opt || marked.defaults).silent) {</span>&nbsp; <span class='diff-add'> return '<p>An error occured:</p><pre>'</span>&nbsp; <span class='diff-add'> + escape(e.message + '', true)</span>&nbsp; <span class='diff-add'> + '</pre>';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> throw e;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>marked.options =</span>&nbsp; <span class='diff-add'>marked.setOptions = function(opt) {</span>&nbsp; <span class='diff-add'> merge(marked.defaults, opt);</span>&nbsp; <span class='diff-add'> return marked;</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>marked.defaults = {</span>&nbsp; <span class='diff-add'> gfm: true,</span>&nbsp; <span class='diff-add'> tables: true,</span>&nbsp; <span class='diff-add'> breaks: false,</span>&nbsp; <span class='diff-add'> pedantic: false,</span>&nbsp; <span class='diff-add'> sanitize: false,</span>&nbsp; <span class='diff-add'> smartLists: false,</span>&nbsp; <span class='diff-add'> silent: false,</span>&nbsp; <span class='diff-add'> highlight: null,</span>&nbsp; <span class='diff-add'> langPrefix: 'lang-',</span>&nbsp; <span class='diff-add'> smartypants: false,</span>&nbsp; <span class='diff-add'> headerPrefix: '',</span>&nbsp; <span class='diff-add'> renderer: new Renderer,</span>&nbsp; <span class='diff-add'> xhtml: false</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * Expose</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>marked.Parser = Parser;</span>&nbsp; <span class='diff-add'>marked.parser = Parser.parse;</span>&nbsp; <span class='diff-add'>marked.Renderer = Renderer;</span>&nbsp; <span class='diff-add'>marked.Lexer = Lexer;</span>&nbsp; <span class='diff-add'>marked.lexer = Lexer.lex;</span>&nbsp; <span class='diff-add'>marked.InlineLexer = InlineLexer;</span>&nbsp; <span class='diff-add'>marked.inlineLexer = InlineLexer.output;</span>&nbsp; <span class='diff-add'>marked.parse = marked;</span>&nbsp; <span class='diff-add'>if (typeof exports === 'object') {</span>&nbsp; <span class='diff-add'> module.exports = marked;</span>&nbsp; <span class='diff-add'>} else if (typeof define === 'function' && define.amd) {</span>&nbsp; <span class='diff-add'> define(function() { return marked; });</span>&nbsp; <span class='diff-add'>} else {</span>&nbsp; <span class='diff-add'> this.marked = marked;</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='diff-add'>}).call(function() {</span>&nbsp; <span class='diff-add'> return this || (typeof window !== 'undefined' ? window : global);</span>&nbsp; <span class='diff-add'>}());</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/matchbrackets.js b/ipynb/Array-feature-overlap-05_files/matchbrackets.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..fa1ae03</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/matchbrackets.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../../lib/codemirror"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../../lib/codemirror"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'> var ie_lt8 = /MSIE \d/.test(navigator.userAgent) &&</span>&nbsp; <span class='diff-add'> (document.documentMode == null || document.documentMode < 8);</span>&nbsp; <span class='diff-add'> var Pos = CodeMirror.Pos;</span>&nbsp; <span class='diff-add'> var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};</span>&nbsp; <span class='diff-add'> function findMatchingBracket(cm, where, strict, config) {</span>&nbsp; <span class='diff-add'> var line = cm.getLineHandle(where.line), pos = where.ch - 1;</span>&nbsp; <span class='diff-add'> var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];</span>&nbsp; <span class='diff-add'> if (!match) return null;</span>&nbsp; <span class='diff-add'> var dir = match.charAt(1) == ">" ? 1 : -1;</span>&nbsp; <span class='diff-add'> if (strict && (dir > 0) != (pos == where.ch)) return null;</span>&nbsp; <span class='diff-add'> var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));</span>&nbsp; <span class='diff-add'> var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);</span>&nbsp; <span class='diff-add'> if (found == null) return null;</span>&nbsp; <span class='diff-add'> return {from: Pos(where.line, pos), to: found && found.pos,</span>&nbsp; <span class='diff-add'> match: found && found.ch == match.charAt(0), forward: dir > 0};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // bracketRegex is used to specify which type of bracket to scan</span>&nbsp; <span class='diff-add'> // should be a regexp, e.g. /[[\]]/</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // Note: If "where" is on an open bracket, then this bracket is ignored.</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // Returns false when no bracket was found, null when it reached</span>&nbsp; <span class='diff-add'> // maxScanLines and gave up</span>&nbsp; <span class='diff-add'> function scanForBracket(cm, where, dir, style, config) {</span>&nbsp; <span class='diff-add'> var maxScanLen = (config && config.maxScanLineLength) || 10000;</span>&nbsp; <span class='diff-add'> var maxScanLines = (config && config.maxScanLines) || 1000;</span>&nbsp; <span class='diff-add'> var stack = [];</span>&nbsp; <span class='diff-add'> var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/;</span>&nbsp; <span class='diff-add'> var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)</span>&nbsp; <span class='diff-add'> : Math.max(cm.firstLine() - 1, where.line - maxScanLines);</span>&nbsp; <span class='diff-add'> for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {</span>&nbsp; <span class='diff-add'> var line = cm.getLine(lineNo);</span>&nbsp; <span class='diff-add'> if (!line) continue;</span>&nbsp; <span class='diff-add'> var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;</span>&nbsp; <span class='diff-add'> if (line.length > maxScanLen) continue;</span>&nbsp; <span class='diff-add'> if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);</span>&nbsp; <span class='diff-add'> for (; pos != end; pos += dir) {</span>&nbsp; <span class='diff-add'> var ch = line.charAt(pos);</span>&nbsp; <span class='diff-add'> if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {</span>&nbsp; <span class='diff-add'> var match = matching[ch];</span>&nbsp; <span class='diff-add'> if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch);</span>&nbsp; <span class='diff-add'> else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};</span>&nbsp; <span class='diff-add'> else stack.pop();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function matchBrackets(cm, autoclear, config) {</span>&nbsp; <span class='diff-add'> // Disable brace matching in long lines, since it'll cause hugely slow updates</span>&nbsp; <span class='diff-add'> var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;</span>&nbsp; <span class='diff-add'> var marks = [], ranges = cm.listSelections();</span>&nbsp; <span class='diff-add'> for (var i = 0; i < ranges.length; i++) {</span>&nbsp; <span class='diff-add'> var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config);</span>&nbsp; <span class='diff-add'> if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {</span>&nbsp; <span class='diff-add'> var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";</span>&nbsp; <span class='diff-add'> marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));</span>&nbsp; <span class='diff-add'> if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)</span>&nbsp; <span class='diff-add'> marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (marks.length) {</span>&nbsp; <span class='diff-add'> // Kludge to work around the IE bug from issue #1193, where text</span>&nbsp; <span class='diff-add'> // input stops going to the textare whever this fires.</span>&nbsp; <span class='diff-add'> if (ie_lt8 && cm.state.focused) cm.display.input.focus();</span>&nbsp; <span class='diff-add'> var clear = function() {</span>&nbsp; <span class='diff-add'> cm.operation(function() {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < marks.length; i++) marks[i].clear();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (autoclear) setTimeout(clear, 800);</span>&nbsp; <span class='diff-add'> else return clear;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var currentlyHighlighted = null;</span>&nbsp; <span class='diff-add'> function doMatchBrackets(cm) {</span>&nbsp; <span class='diff-add'> cm.operation(function() {</span>&nbsp; <span class='diff-add'> if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}</span>&nbsp; <span class='diff-add'> currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) {</span>&nbsp; <span class='diff-add'> if (old && old != CodeMirror.Init)</span>&nbsp; <span class='diff-add'> cm.off("cursorActivity", doMatchBrackets);</span>&nbsp; <span class='diff-add'> if (val) {</span>&nbsp; <span class='diff-add'> cm.state.matchBrackets = typeof val == "object" ? val : {};</span>&nbsp; <span class='diff-add'> cm.on("cursorActivity", doMatchBrackets);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);});</span>&nbsp; <span class='diff-add'> CodeMirror.defineExtension("findMatchingBracket", function(pos, strict, config){</span>&nbsp; <span class='diff-add'> return findMatchingBracket(this, pos, strict, config);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){</span>&nbsp; <span class='diff-add'> return scanForBracket(this, pos, dir, style, config);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/mathjaxutils.js b/ipynb/Array-feature-overlap-05_files/mathjaxutils.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..ba5b59b</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/mathjaxutils.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'base/js/dialog',</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils, dialog) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var init = function () {</span>&nbsp; <span class='diff-add'> if (window.MathJax) {</span>&nbsp; <span class='diff-add'> // MathJax loaded</span>&nbsp; <span class='diff-add'> MathJax.Hub.Config({</span>&nbsp; <span class='diff-add'> tex2jax: {</span>&nbsp; <span class='diff-add'> inlineMath: [ ['$','$'], ["\\(","\\)"] ],</span>&nbsp; <span class='diff-add'> displayMath: [ ['$$','$$'], ["\\[","\\]"] ],</span>&nbsp; <span class='diff-add'> processEscapes: true,</span>&nbsp; <span class='diff-add'> processEnvironments: true</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> // Center justify equations in code and markdown cells. Elsewhere</span>&nbsp; <span class='diff-add'> // we use CSS to left justify single line equations in code cells.</span>&nbsp; <span class='diff-add'> displayAlign: 'center',</span>&nbsp; <span class='diff-add'> "HTML-CSS": {</span>&nbsp; <span class='diff-add'> styles: {'.MathJax_Display': {"margin": 0}},</span>&nbsp; <span class='diff-add'> linebreaks: { automatic: true }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> MathJax.Hub.Configured();</span>&nbsp; <span class='diff-add'> } else if (window.mathjax_url !== "") {</span>&nbsp; <span class='diff-add'> // Don't have MathJax, but should. Show dialog.</span>&nbsp; <span class='diff-add'> var message = $('<div/>')</span>&nbsp; <span class='diff-add'> .append(</span>&nbsp; <span class='diff-add'> $("<p/></p>").addClass('dialog').text(</span>&nbsp; <span class='diff-add'> "Math/LaTeX rendering will be disabled."</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<p></p>").addClass('dialog').text(</span>&nbsp; <span class='diff-add'> "If you have administrative access to the notebook server and" +</span>&nbsp; <span class='diff-add'> " a working internet connection, you can install a local copy" +</span>&nbsp; <span class='diff-add'> " of MathJax for offline use with the following command on the server" +</span>&nbsp; <span class='diff-add'> " at a Python or IPython prompt:"</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<pre></pre>").addClass('dialog').text(</span>&nbsp; <span class='diff-add'> ">>> from IPython.external import mathjax; mathjax.install_mathjax()"</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<p></p>").addClass('dialog').text(</span>&nbsp; <span class='diff-add'> "This will try to install MathJax into the IPython source directory."</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<p></p>").addClass('dialog').text(</span>&nbsp; <span class='diff-add'> "If IPython is installed to a location that requires" +</span>&nbsp; <span class='diff-add'> " administrative privileges to write, you will need to make this call as" +</span>&nbsp; <span class='diff-add'> " an administrator, via 'sudo'."</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<p></p>").addClass('dialog').text(</span>&nbsp; <span class='diff-add'> "When you start the notebook server, you can instruct it to disable MathJax support altogether:"</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<pre></pre>").addClass('dialog').text(</span>&nbsp; <span class='diff-add'> "$ ipython notebook --no-mathjax"</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<p></p>").addClass('dialog').text(</span>&nbsp; <span class='diff-add'> "which will prevent this dialog from appearing."</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> title : "Failed to retrieve MathJax from '" + window.mathjax_url + "'",</span>&nbsp; <span class='diff-add'> body : message,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> OK : {class: "btn-danger"}</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Some magic for deferring mathematical expressions to MathJax</span>&nbsp; <span class='diff-add'> // by hiding them from the Markdown parser.</span>&nbsp; <span class='diff-add'> // Some of the code here is adapted with permission from Davide Cervone</span>&nbsp; <span class='diff-add'> // under the terms of the Apache2 license governing the MathJax project.</span>&nbsp; <span class='diff-add'> // Other minor modifications are also due to StackExchange and are used with</span>&nbsp; <span class='diff-add'> // permission.</span>&nbsp; <span class='diff-add'> var inline = "$"; // the inline math delimiter</span>&nbsp; <span class='diff-add'> // MATHSPLIT contains the pattern for math delimiters and special symbols</span>&nbsp; <span class='diff-add'> // needed for searching for math in the text input.</span>&nbsp; <span class='diff-add'> var MATHSPLIT = /(\$\$?|\\(?:begin|end)\{[a-z]*\*?\}|\\[\\{}$]|[{}]|(?:\n\s*)+|@@\d+@@)/i;</span>&nbsp; <span class='diff-add'> // The math is in blocks i through j, so</span>&nbsp; <span class='diff-add'> // collect it into one block and clear the others.</span>&nbsp; <span class='diff-add'> // Replace &, <, and > by named entities.</span>&nbsp; <span class='diff-add'> // For IE, put <br> at the ends of comments since IE removes \n.</span>&nbsp; <span class='diff-add'> // Clear the current math positions and store the index of the</span>&nbsp; <span class='diff-add'> // math, then push the math string onto the storage array.</span>&nbsp; <span class='diff-add'> // The preProcess function is called on all blocks if it has been passed in</span>&nbsp; <span class='diff-add'> var process_math = function (i, j, pre_process, math, blocks) {</span>&nbsp; <span class='diff-add'> var block = blocks.slice(i, j + 1).join("").replace(/&/g, "&amp;") // use HTML entity for &</span>&nbsp; <span class='diff-add'> .replace(/</g, "&lt;") // use HTML entity for <</span>&nbsp; <span class='diff-add'> .replace(/>/g, "&gt;") // use HTML entity for ></span>&nbsp; <span class='diff-add'> ;</span>&nbsp; <span class='diff-add'> if (utils.browser === 'msie') {</span>&nbsp; <span class='diff-add'> block = block.replace(/(%[^\n]*)\n/g, "$1<br/>\n");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> while (j > i) {</span>&nbsp; <span class='diff-add'> blocks[j] = "";</span>&nbsp; <span class='diff-add'> j--;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> blocks[i] = "@@" + math.length + "@@"; // replace the current block text with a unique tag to find later</span>&nbsp; <span class='diff-add'> if (pre_process){</span>&nbsp; <span class='diff-add'> block = pre_process(block);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> math.push(block);</span>&nbsp; <span class='diff-add'> return blocks;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Break up the text into its component parts and search</span>&nbsp; <span class='diff-add'> // through them for math delimiters, braces, linebreaks, etc.</span>&nbsp; <span class='diff-add'> // Math delimiters must match and braces must balance.</span>&nbsp; <span class='diff-add'> // Don't allow math to pass through a double linebreak</span>&nbsp; <span class='diff-add'> // (which will be a paragraph).</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> var remove_math = function (text) {</span>&nbsp; <span class='diff-add'> var math = []; // stores math strings for later</span>&nbsp; <span class='diff-add'> var start;</span>&nbsp; <span class='diff-add'> var end;</span>&nbsp; <span class='diff-add'> var last;</span>&nbsp; <span class='diff-add'> var braces;</span>&nbsp; <span class='diff-add'> // Except for extreme edge cases, this should catch precisely those pieces of the markdown</span>&nbsp; <span class='diff-add'> // source that will later be turned into code spans. While MathJax will not TeXify code spans,</span>&nbsp; <span class='diff-add'> // we still have to consider them at this point; the following issue has happened several times:</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // `$foo` and `$bar` are varibales. --> <code>$foo ` and `$bar</code> are variables.</span>&nbsp; <span class='diff-add'> var hasCodeSpans = /`/.test(text),</span>&nbsp; <span class='diff-add'> de_tilde;</span>&nbsp; <span class='diff-add'> if (hasCodeSpans) {</span>&nbsp; <span class='diff-add'> text = text.replace(/~/g, "~T").replace(/(^|[^\\])(`+)([^\n]*?[^`\n])\2(?!`)/gm, function (wholematch) {</span>&nbsp; <span class='diff-add'> return wholematch.replace(/\$/g, "~D");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> de_tilde = function (text) {</span>&nbsp; <span class='diff-add'> return text.replace(/~([TD])/g, function (wholematch, character) {</span>&nbsp; <span class='diff-add'> return { T: "~", D: "$" }[character];</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> de_tilde = function (text) { return text; };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var blocks = utils.regex_split(text.replace(/\r\n?/g, "\n"),MATHSPLIT);</span>&nbsp; <span class='diff-add'> for (var i = 1, m = blocks.length; i < m; i += 2) {</span>&nbsp; <span class='diff-add'> var block = blocks[i];</span>&nbsp; <span class='diff-add'> if (block.charAt(0) === "@") {</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // Things that look like our math markers will get</span>&nbsp; <span class='diff-add'> // stored and then retrieved along with the math.</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> blocks[i] = "@@" + math.length + "@@";</span>&nbsp; <span class='diff-add'> math.push(block);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else if (start) {</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // If we are in math, look for the end delimiter,</span>&nbsp; <span class='diff-add'> // but don't go past double line breaks, and</span>&nbsp; <span class='diff-add'> // and balance braces within the math.</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> if (block === end) {</span>&nbsp; <span class='diff-add'> if (braces) {</span>&nbsp; <span class='diff-add'> last = i;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> blocks = process_math(start, i, de_tilde, math, blocks);</span>&nbsp; <span class='diff-add'> start = null;</span>&nbsp; <span class='diff-add'> end = null;</span>&nbsp; <span class='diff-add'> last = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else if (block.match(/\n.*\n/)) {</span>&nbsp; <span class='diff-add'> if (last) {</span>&nbsp; <span class='diff-add'> i = last;</span>&nbsp; <span class='diff-add'> blocks = process_math(start, i, de_tilde, math, blocks);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> start = null;</span>&nbsp; <span class='diff-add'> end = null;</span>&nbsp; <span class='diff-add'> last = null;</span>&nbsp; <span class='diff-add'> braces = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else if (block === "{") {</span>&nbsp; <span class='diff-add'> braces++;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else if (block === "}" && braces) {</span>&nbsp; <span class='diff-add'> braces--;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // Look for math start delimiters and when</span>&nbsp; <span class='diff-add'> // found, set up the end delimiter.</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> if (block === inline || block === "$$") {</span>&nbsp; <span class='diff-add'> start = i;</span>&nbsp; <span class='diff-add'> end = block;</span>&nbsp; <span class='diff-add'> braces = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else if (block.substr(1, 5) === "begin") {</span>&nbsp; <span class='diff-add'> start = i;</span>&nbsp; <span class='diff-add'> end = "\\end" + block.substr(6);</span>&nbsp; <span class='diff-add'> braces = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (last) {</span>&nbsp; <span class='diff-add'> blocks = process_math(start, last, de_tilde, math, blocks);</span>&nbsp; <span class='diff-add'> start = null;</span>&nbsp; <span class='diff-add'> end = null;</span>&nbsp; <span class='diff-add'> last = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return [de_tilde(blocks.join("")), math];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // Put back the math strings that were saved,</span>&nbsp; <span class='diff-add'> // and clear the math array (no need to keep it around).</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> var replace_math = function (text, math) {</span>&nbsp; <span class='diff-add'> text = text.replace(/@@(\d+)@@/g, function (match, n) {</span>&nbsp; <span class='diff-add'> return math[n];</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return text;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var mathjaxutils = {</span>&nbsp; <span class='diff-add'> init : init,</span>&nbsp; <span class='diff-add'> remove_math : remove_math,</span>&nbsp; <span class='diff-add'> replace_math : replace_math</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> IPython.mathjaxutils = mathjaxutils;</span>&nbsp; <span class='diff-add'> return mathjaxutils;</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/menubar.js b/ipynb/Array-feature-overlap-05_files/menubar.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..24464fd</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/menubar.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'base/js/dialog',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'notebook/js/tour',</span>&nbsp; <span class='diff-add'> 'bootstrap',</span>&nbsp; <span class='diff-add'> 'moment',</span>&nbsp; <span class='diff-add'>], function($, IPython, dialog, utils, tour, bootstrap, moment) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var MenuBar = function (selector, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * A MenuBar Class to generate the menubar of IPython notebook</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters:</span>&nbsp; <span class='diff-add'> * selector: string</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> * notebook: Notebook instance</span>&nbsp; <span class='diff-add'> * contents: ContentManager instance</span>&nbsp; <span class='diff-add'> * events: $(Events) instance</span>&nbsp; <span class='diff-add'> * save_widget: SaveWidget instance</span>&nbsp; <span class='diff-add'> * quick_help: QuickHelp instance</span>&nbsp; <span class='diff-add'> * base_url : string</span>&nbsp; <span class='diff-add'> * notebook_path : string</span>&nbsp; <span class='diff-add'> * notebook_name : string</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> this.base_url = options.base_url || utils.get_body_data("baseUrl");</span>&nbsp; <span class='diff-add'> this.selector = selector;</span>&nbsp; <span class='diff-add'> this.notebook = options.notebook;</span>&nbsp; <span class='diff-add'> this.contents = options.contents;</span>&nbsp; <span class='diff-add'> this.events = options.events;</span>&nbsp; <span class='diff-add'> this.save_widget = options.save_widget;</span>&nbsp; <span class='diff-add'> this.quick_help = options.quick_help;</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> this.tour = new tour.Tour(this.notebook, this.events);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> this.tour = undefined;</span>&nbsp; <span class='diff-add'> console.log("Failed to instantiate Notebook Tour", e);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.selector !== undefined) {</span>&nbsp; <span class='diff-add'> this.element = $(selector);</span>&nbsp; <span class='diff-add'> this.style();</span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // TODO: This has definitively nothing to do with style ...</span>&nbsp; <span class='diff-add'> MenuBar.prototype.style = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.element.find("li").click(function (event, ui) {</span>&nbsp; <span class='diff-add'> // The selected cell loses focus when the menu is entered, so we</span>&nbsp; <span class='diff-add'> // re-select it upon selection.</span>&nbsp; <span class='diff-add'> var i = that.notebook.get_selected_index();</span>&nbsp; <span class='diff-add'> that.notebook.select(i);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> MenuBar.prototype._nbconvert = function (format, download) {</span>&nbsp; <span class='diff-add'> download = download || false;</span>&nbsp; <span class='diff-add'> var notebook_path = this.notebook.notebook_path;</span>&nbsp; <span class='diff-add'> var url = utils.url_join_encode(</span>&nbsp; <span class='diff-add'> this.base_url,</span>&nbsp; <span class='diff-add'> 'nbconvert',</span>&nbsp; <span class='diff-add'> format,</span>&nbsp; <span class='diff-add'> notebook_path</span>&nbsp; <span class='diff-add'> ) + "?download=" + download.toString();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var w = window.open(undefined, IPython._target);</span>&nbsp; <span class='diff-add'> if (this.notebook.dirty) {</span>&nbsp; <span class='diff-add'> this.notebook.save_notebook().then(function() {</span>&nbsp; <span class='diff-add'> w.location = url;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> w.location = url;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> MenuBar.prototype._size_header = function() {</span>&nbsp; <span class='diff-add'> /** </span>&nbsp; <span class='diff-add'> * Update header spacer size.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.events.trigger('resize-header.Page');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> MenuBar.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * File</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.element.find('#open_notebook').click(function () {</span>&nbsp; <span class='diff-add'> var parent = utils.url_path_split(that.notebook.notebook_path)[0];</span>&nbsp; <span class='diff-add'> window.open(utils.url_join_encode(that.base_url, 'tree', parent), IPython._target);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#copy_notebook').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.copy_notebook();</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#download_ipynb').click(function () {</span>&nbsp; <span class='diff-add'> var base_url = that.notebook.base_url;</span>&nbsp; <span class='diff-add'> var notebook_path = that.notebook.notebook_path;</span>&nbsp; <span class='diff-add'> if (that.notebook.dirty) {</span>&nbsp; <span class='diff-add'> that.notebook.save_notebook({async : false});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var url = utils.url_join_encode(base_url, 'files', notebook_path);</span>&nbsp; <span class='diff-add'> window.open(url + '?download=1');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.element.find('#print_preview').click(function () {</span>&nbsp; <span class='diff-add'> that._nbconvert('html', false);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#download_html').click(function () {</span>&nbsp; <span class='diff-add'> that._nbconvert('html', true);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#download_rst').click(function () {</span>&nbsp; <span class='diff-add'> that._nbconvert('rst', true);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#download_pdf').click(function () {</span>&nbsp; <span class='diff-add'> that._nbconvert('pdf', true);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#download_script').click(function () {</span>&nbsp; <span class='diff-add'> that._nbconvert('script', true);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#rename_notebook').click(function () {</span>&nbsp; <span class='diff-add'> that.save_widget.rename_notebook({notebook: that.notebook});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#save_checkpoint').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.save_checkpoint();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#restore_checkpoint').click(function () {</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#trust_notebook').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.trust_notebook();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('trust_changed.Notebook', function (event, trusted) {</span>&nbsp; <span class='diff-add'> if (trusted) {</span>&nbsp; <span class='diff-add'> that.element.find('#trust_notebook')</span>&nbsp; <span class='diff-add'> .addClass("disabled").off('click')</span>&nbsp; <span class='diff-add'> .find("a").text("Trusted Notebook");</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> that.element.find('#trust_notebook')</span>&nbsp; <span class='diff-add'> .removeClass("disabled").on('click', function () {</span>&nbsp; <span class='diff-add'> that.notebook.trust_notebook();</span>&nbsp; <span class='diff-add'> })</span>&nbsp; <span class='diff-add'> .find("a").text("Trust Notebook");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#kill_and_exit').click(function () {</span>&nbsp; <span class='diff-add'> var close_window = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * allow closing of new tabs in Chromium, impossible in FF</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> window.open('', '_self', '');</span>&nbsp; <span class='diff-add'> window.close();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // finish with close on success or failure</span>&nbsp; <span class='diff-add'> that.notebook.session.delete(close_window, close_window);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Edit</span>&nbsp; <span class='diff-add'> this.element.find('#cut_cell').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.cut_cell();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#copy_cell').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.copy_cell();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#delete_cell').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.delete_cell();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#undelete_cell').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.undelete_cell();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#split_cell').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.split_cell();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#merge_cell_above').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.merge_cell_above();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#merge_cell_below').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.merge_cell_below();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#move_cell_up').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.move_cell_up();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#move_cell_down').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.move_cell_down();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#edit_nb_metadata').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.edit_metadata({</span>&nbsp; <span class='diff-add'> notebook: that.notebook,</span>&nbsp; <span class='diff-add'> keyboard_manager: that.notebook.keyboard_manager});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // View</span>&nbsp; <span class='diff-add'> this.element.find('#toggle_header').click(function () {</span>&nbsp; <span class='diff-add'> $('#header-container').toggle();</span>&nbsp; <span class='diff-add'> $('.header-bar').toggle();</span>&nbsp; <span class='diff-add'> that._size_header();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#toggle_toolbar').click(function () {</span>&nbsp; <span class='diff-add'> $('div#maintoolbar').toggle();</span>&nbsp; <span class='diff-add'> that._size_header();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Insert</span>&nbsp; <span class='diff-add'> this.element.find('#insert_cell_above').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.insert_cell_above('code');</span>&nbsp; <span class='diff-add'> that.notebook.select_prev();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#insert_cell_below').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.insert_cell_below('code');</span>&nbsp; <span class='diff-add'> that.notebook.select_next();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Cell</span>&nbsp; <span class='diff-add'> this.element.find('#run_cell').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.execute_cell();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#run_cell_select_below').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.execute_cell_and_select_below();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#run_cell_insert_below').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.execute_cell_and_insert_below();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#run_all_cells').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.execute_all_cells();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#run_all_cells_above').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.execute_cells_above();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#run_all_cells_below').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.execute_cells_below();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#to_code').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.to_code();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#to_markdown').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.to_markdown();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#to_raw').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.to_raw();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.element.find('#toggle_current_output').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.toggle_output();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#toggle_current_output_scroll').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.toggle_output_scroll();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#clear_current_output').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.clear_output();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.element.find('#toggle_all_output').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.toggle_all_output();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#toggle_all_output_scroll').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.toggle_all_output_scroll();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#clear_all_output').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.clear_all_output();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Kernel</span>&nbsp; <span class='diff-add'> this.element.find('#int_kernel').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.kernel.interrupt();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#restart_kernel').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.restart_kernel();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.find('#reconnect_kernel').click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.kernel.reconnect();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Help</span>&nbsp; <span class='diff-add'> if (this.tour) {</span>&nbsp; <span class='diff-add'> this.element.find('#notebook_tour').click(function () {</span>&nbsp; <span class='diff-add'> that.tour.start();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.element.find('#notebook_tour').addClass("disabled");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.element.find('#keyboard_shortcuts').click(function () {</span>&nbsp; <span class='diff-add'> that.quick_help.show_keyboard_shortcuts();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.update_restore_checkpoint(null);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.events.on('checkpoints_listed.Notebook', function (event, data) {</span>&nbsp; <span class='diff-add'> that.update_restore_checkpoint(that.notebook.checkpoints);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.events.on('checkpoint_created.Notebook', function (event, data) {</span>&nbsp; <span class='diff-add'> that.update_restore_checkpoint(that.notebook.checkpoints);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.events.on('notebook_loaded.Notebook', function() {</span>&nbsp; <span class='diff-add'> var langinfo = that.notebook.metadata.language_info || {};</span>&nbsp; <span class='diff-add'> that.update_nbconvert_script(langinfo);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.events.on('kernel_ready.Kernel', function(event, data) {</span>&nbsp; <span class='diff-add'> var langinfo = data.kernel.info_reply.language_info || {};</span>&nbsp; <span class='diff-add'> that.update_nbconvert_script(langinfo);</span>&nbsp; <span class='diff-add'> that.add_kernel_help_links(data.kernel.info_reply.help_links || []);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> MenuBar.prototype.update_restore_checkpoint = function(checkpoints) {</span>&nbsp; <span class='diff-add'> var ul = this.element.find("#restore_checkpoint").find("ul");</span>&nbsp; <span class='diff-add'> ul.empty();</span>&nbsp; <span class='diff-add'> if (!checkpoints || checkpoints.length === 0) {</span>&nbsp; <span class='diff-add'> ul.append(</span>&nbsp; <span class='diff-add'> $("<li/>")</span>&nbsp; <span class='diff-add'> .addClass("disabled")</span>&nbsp; <span class='diff-add'> .append(</span>&nbsp; <span class='diff-add'> $("<a/>")</span>&nbsp; <span class='diff-add'> .text("No checkpoints")</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> checkpoints.map(function (checkpoint) {</span>&nbsp; <span class='diff-add'> var d = new Date(checkpoint.last_modified);</span>&nbsp; <span class='diff-add'> ul.append(</span>&nbsp; <span class='diff-add'> $("<li/>").append(</span>&nbsp; <span class='diff-add'> $("<a/>")</span>&nbsp; <span class='diff-add'> .attr("href", "#")</span>&nbsp; <span class='diff-add'> .text(moment(d).format("LLLL"))</span>&nbsp; <span class='diff-add'> .click(function () {</span>&nbsp; <span class='diff-add'> that.notebook.restore_checkpoint_dialog(checkpoint);</span>&nbsp; <span class='diff-add'> })</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> MenuBar.prototype.update_nbconvert_script = function(langinfo) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set the 'Download as foo' menu option for the relevant language.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var el = this.element.find('#download_script');</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Set menu entry text to e.g. "Python (.py)"</span>&nbsp; <span class='diff-add'> var langname = (langinfo.name || 'Script');</span>&nbsp; <span class='diff-add'> langname = langname.charAt(0).toUpperCase()+langname.substr(1); // Capitalise</span>&nbsp; <span class='diff-add'> el.find('a').text(langname + ' ('+(langinfo.file_extension || 'txt')+')');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> MenuBar.prototype.add_kernel_help_links = function(help_links) {</span>&nbsp; <span class='diff-add'> /** add links from kernel_info to the help menu */</span>&nbsp; <span class='diff-add'> var divider = $("#kernel-help-links");</span>&nbsp; <span class='diff-add'> if (divider.length === 0) {</span>&nbsp; <span class='diff-add'> // insert kernel help section above about link</span>&nbsp; <span class='diff-add'> var about = $("#notebook_about").parent();</span>&nbsp; <span class='diff-add'> divider = $("<li>")</span>&nbsp; <span class='diff-add'> .attr('id', "kernel-help-links")</span>&nbsp; <span class='diff-add'> .addClass('divider');</span>&nbsp; <span class='diff-add'> about.prev().before(divider);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // remove previous entries</span>&nbsp; <span class='diff-add'> while (!divider.next().hasClass('divider')) {</span>&nbsp; <span class='diff-add'> divider.next().remove();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (help_links.length === 0) {</span>&nbsp; <span class='diff-add'> // no help links, remove the divider</span>&nbsp; <span class='diff-add'> divider.remove();</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var cursor = divider;</span>&nbsp; <span class='diff-add'> help_links.map(function (link) {</span>&nbsp; <span class='diff-add'> cursor.after($("<li>")</span>&nbsp; <span class='diff-add'> .append($("<a>")</span>&nbsp; <span class='diff-add'> .attr('target', '_blank')</span>&nbsp; <span class='diff-add'> .attr('title', 'Opens in a new window')</span>&nbsp; <span class='diff-add'> .attr('href', link.url)</span>&nbsp; <span class='diff-add'> .append($("<i>")</span>&nbsp; <span class='diff-add'> .addClass("fa fa-external-link menu-icon pull-right")</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> .append($("<span>")</span>&nbsp; <span class='diff-add'> .text(link.text)</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> cursor = cursor.next();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.MenuBar = MenuBar;</span>&nbsp; <span class='diff-add'> return {'MenuBar': MenuBar};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/meta.js b/ipynb/Array-feature-overlap-05_files/meta.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..fcaed98</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/meta.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../lib/codemirror"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../lib/codemirror"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> CodeMirror.modeInfo = [</span>&nbsp; <span class='diff-add'> {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]},</span>&nbsp; <span class='diff-add'> {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk"},</span>&nbsp; <span class='diff-add'> {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h"]},</span>&nbsp; <span class='diff-add'> {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "hpp", "h++"], alias: ["cpp"]},</span>&nbsp; <span class='diff-add'> {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy"]},</span>&nbsp; <span class='diff-add'> {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp"]},</span>&nbsp; <span class='diff-add'> {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj"]},</span>&nbsp; <span class='diff-add'> {name: "CoffeeScript", mime: "text/x-coffeescript", mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]},</span>&nbsp; <span class='diff-add'> {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]},</span>&nbsp; <span class='diff-add'> {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher"},</span>&nbsp; <span class='diff-add'> {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]},</span>&nbsp; <span class='diff-add'> {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]},</span>&nbsp; <span class='diff-add'> {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]},</span>&nbsp; <span class='diff-add'> {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]},</span>&nbsp; <span class='diff-add'> {name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"]},</span>&nbsp; <span class='diff-add'> {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]},</span>&nbsp; <span class='diff-add'> {name: "Django", mime: "text/x-django", mode: "django"},</span>&nbsp; <span class='diff-add'> {name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile"},</span>&nbsp; <span class='diff-add'> {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]},</span>&nbsp; <span class='diff-add'> {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]},</span>&nbsp; <span class='diff-add'> {name: "EBNF", mime: "text/x-ebnf", mode: "ebnf"},</span>&nbsp; <span class='diff-add'> {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]},</span>&nbsp; <span class='diff-add'> {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]},</span>&nbsp; <span class='diff-add'> {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},</span>&nbsp; <span class='diff-add'> {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]},</span>&nbsp; <span class='diff-add'> {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]},</span>&nbsp; <span class='diff-add'> {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90"]},</span>&nbsp; <span class='diff-add'> {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]},</span>&nbsp; <span class='diff-add'> {name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]},</span>&nbsp; <span class='diff-add'> {name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]},</span>&nbsp; <span class='diff-add'> {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm"},</span>&nbsp; <span class='diff-add'> {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]},</span>&nbsp; <span class='diff-add'> {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy"]},</span>&nbsp; <span class='diff-add'> {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]},</span>&nbsp; <span class='diff-add'> {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]},</span>&nbsp; <span class='diff-add'> {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]},</span>&nbsp; <span class='diff-add'> {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]},</span>&nbsp; <span class='diff-add'> {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]},</span>&nbsp; <span class='diff-add'> {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm"], alias: ["xhtml"]},</span>&nbsp; <span class='diff-add'> {name: "HTTP", mime: "message/http", mode: "http"},</span>&nbsp; <span class='diff-add'> {name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"]},</span>&nbsp; <span class='diff-add'> {name: "Jade", mime: "text/x-jade", mode: "jade", ext: ["jade"]},</span>&nbsp; <span class='diff-add'> {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]},</span>&nbsp; <span class='diff-add'> {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"]},</span>&nbsp; <span class='diff-add'> {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"],</span>&nbsp; <span class='diff-add'> mode: "javascript", ext: ["js"], alias: ["ecmascript", "js", "node"]},</span>&nbsp; <span class='diff-add'> {name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"]},</span>&nbsp; <span class='diff-add'> {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", alias: ["jsonld"]},</span>&nbsp; <span class='diff-add'> {name: "Jinja2", mime: "null", mode: "jinja2"},</span>&nbsp; <span class='diff-add'> {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"]},</span>&nbsp; <span class='diff-add'> {name: "Kotlin", mime: "text/x-kotlin", mode: "kotlin", ext: ["kt"]},</span>&nbsp; <span class='diff-add'> {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]},</span>&nbsp; <span class='diff-add'> {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]},</span>&nbsp; <span class='diff-add'> {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]},</span>&nbsp; <span class='diff-add'> {name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]},</span>&nbsp; <span class='diff-add'> {name: "mIRC", mime: "text/mirc", mode: "mirc"},</span>&nbsp; <span class='diff-add'> {name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"},</span>&nbsp; <span class='diff-add'> {name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]},</span>&nbsp; <span class='diff-add'> {name: "MS SQL", mime: "text/x-mssql", mode: "sql"},</span>&nbsp; <span class='diff-add'> {name: "MySQL", mime: "text/x-mysql", mode: "sql"},</span>&nbsp; <span class='diff-add'> {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx"},</span>&nbsp; <span class='diff-add'> {name: "NTriples", mime: "text/n-triples", mode: "ntriples", ext: ["nt"]},</span>&nbsp; <span class='diff-add'> {name: "Objective C", mime: "text/x-objectivec", mode: "clike", ext: ["m", "mm"]},</span>&nbsp; <span class='diff-add'> {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]},</span>&nbsp; <span class='diff-add'> {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]},</span>&nbsp; <span class='diff-add'> {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]},</span>&nbsp; <span class='diff-add'> {name: "PEG.js", mime: "null", mode: "pegjs"},</span>&nbsp; <span class='diff-add'> {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]},</span>&nbsp; <span class='diff-add'> {name: "PHP", mime: "application/x-httpd-php", mode: "php", ext: ["php", "php3", "php4", "php5", "phtml"]},</span>&nbsp; <span class='diff-add'> {name: "Pig", mime: "text/x-pig", mode: "pig"},</span>&nbsp; <span class='diff-add'> {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]},</span>&nbsp; <span class='diff-add'> {name: "PLSQL", mime: "text/x-plsql", mode: "sql"},</span>&nbsp; <span class='diff-add'> {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"]},</span>&nbsp; <span class='diff-add'> {name: "Python", mime: "text/x-python", mode: "python", ext: ["py", "pyw"]},</span>&nbsp; <span class='diff-add'> {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]},</span>&nbsp; <span class='diff-add'> {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]},</span>&nbsp; <span class='diff-add'> {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r"], alias: ["rscript"]},</span>&nbsp; <span class='diff-add'> {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"]},</span>&nbsp; <span class='diff-add'> {name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm"},</span>&nbsp; <span class='diff-add'> {name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"]},</span>&nbsp; <span class='diff-add'> {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"]},</span>&nbsp; <span class='diff-add'> {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]},</span>&nbsp; <span class='diff-add'> {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]},</span>&nbsp; <span class='diff-add'> {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]},</span>&nbsp; <span class='diff-add'> {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]},</span>&nbsp; <span class='diff-add'> {name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]},</span>&nbsp; <span class='diff-add'> {name: "Shell", mime: "text/x-sh", mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"]},</span>&nbsp; <span class='diff-add'> {name: "Sieve", mime: "application/sieve", mode: "sieve"},</span>&nbsp; <span class='diff-add'> {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim"},</span>&nbsp; <span class='diff-add'> {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]},</span>&nbsp; <span class='diff-add'> {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]},</span>&nbsp; <span class='diff-add'> {name: "SmartyMixed", mime: "text/x-smarty", mode: "smartymixed"},</span>&nbsp; <span class='diff-add'> {name: "Solr", mime: "text/x-solr", mode: "solr"},</span>&nbsp; <span class='diff-add'> {name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"]},</span>&nbsp; <span class='diff-add'> {name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"]},</span>&nbsp; <span class='diff-add'> {name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"]},</span>&nbsp; <span class='diff-add'> {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]},</span>&nbsp; <span class='diff-add'> {name: "MariaDB", mime: "text/x-mariadb", mode: "sql"},</span>&nbsp; <span class='diff-add'> {name: "sTeX", mime: "text/x-stex", mode: "stex"},</span>&nbsp; <span class='diff-add'> {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx"], alias: ["tex"]},</span>&nbsp; <span class='diff-add'> {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v"]},</span>&nbsp; <span class='diff-add'> {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]},</span>&nbsp; <span class='diff-add'> {name: "Textile", mime: "text/x-textile", mode: "textile"},</span>&nbsp; <span class='diff-add'> {name: "TiddlyWiki ", mime: "text/x-tiddlywiki", mode: "tiddlywiki"},</span>&nbsp; <span class='diff-add'> {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"},</span>&nbsp; <span class='diff-add'> {name: "TOML", mime: "text/x-toml", mode: "toml"},</span>&nbsp; <span class='diff-add'> {name: "Tornado", mime: "text/x-tornado", mode: "tornado"},</span>&nbsp; <span class='diff-add'> {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]},</span>&nbsp; <span class='diff-add'> {name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"]},</span>&nbsp; <span class='diff-add'> {name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]},</span>&nbsp; <span class='diff-add'> {name: "VBScript", mime: "text/vbscript", mode: "vbscript"},</span>&nbsp; <span class='diff-add'> {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]},</span>&nbsp; <span class='diff-add'> {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]},</span>&nbsp; <span class='diff-add'> {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd"], alias: ["rss", "wsdl", "xsd"]},</span>&nbsp; <span class='diff-add'> {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]},</span>&nbsp; <span class='diff-add'> {name: "YAML", mime: "text/x-yaml", mode: "yaml", ext: ["yaml"], alias: ["yml"]},</span>&nbsp; <span class='diff-add'> {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]}</span>&nbsp; <span class='diff-add'> ];</span>&nbsp; <span class='diff-add'> // Ensure all modes have a mime property for backwards compatibility</span>&nbsp; <span class='diff-add'> for (var i = 0; i < CodeMirror.modeInfo.length; i++) {</span>&nbsp; <span class='diff-add'> var info = CodeMirror.modeInfo[i];</span>&nbsp; <span class='diff-add'> if (info.mimes) info.mime = info.mimes[0];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> CodeMirror.findModeByMIME = function(mime) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < CodeMirror.modeInfo.length; i++) {</span>&nbsp; <span class='diff-add'> var info = CodeMirror.modeInfo[i];</span>&nbsp; <span class='diff-add'> if (info.mime == mime) return info;</span>&nbsp; <span class='diff-add'> if (info.mimes) for (var j = 0; j < info.mimes.length; j++)</span>&nbsp; <span class='diff-add'> if (info.mimes[j] == mime) return info;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeMirror.findModeByExtension = function(ext) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < CodeMirror.modeInfo.length; i++) {</span>&nbsp; <span class='diff-add'> var info = CodeMirror.modeInfo[i];</span>&nbsp; <span class='diff-add'> if (info.ext) for (var j = 0; j < info.ext.length; j++)</span>&nbsp; <span class='diff-add'> if (info.ext[j] == ext) return info;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> CodeMirror.findModeByName = function(name) {</span>&nbsp; <span class='diff-add'> name = name.toLowerCase();</span>&nbsp; <span class='diff-add'> for (var i = 0; i < CodeMirror.modeInfo.length; i++) {</span>&nbsp; <span class='diff-add'> var info = CodeMirror.modeInfo[i];</span>&nbsp; <span class='diff-add'> if (info.name.toLowerCase() == name) return info;</span>&nbsp; <span class='diff-add'> if (info.alias) for (var j = 0; j < info.alias.length; j++)</span>&nbsp; <span class='diff-add'> if (info.alias[j].toLowerCase() == name) return info;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/moment.js b/ipynb/Array-feature-overlap-05_files/moment.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..85e190d</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/moment.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>//! moment.js</span>&nbsp; <span class='diff-add'>//! version : 2.8.4</span>&nbsp; <span class='diff-add'>//! authors : Tim Wood, Iskren Chernev, Moment.js contributors</span>&nbsp; <span class='diff-add'>//! license : MIT</span>&nbsp; <span class='diff-add'>//! momentjs.com</span>&nbsp; <span class='diff-add'>(function (undefined) {</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Constants</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> var moment,</span>&nbsp; <span class='diff-add'> VERSION = '2.8.4',</span>&nbsp; <span class='diff-add'> // the global-scope this is NOT the global object in Node.js</span>&nbsp; <span class='diff-add'> globalScope = typeof global !== 'undefined' ? global : this,</span>&nbsp; <span class='diff-add'> oldGlobalMoment,</span>&nbsp; <span class='diff-add'> round = Math.round,</span>&nbsp; <span class='diff-add'> hasOwnProperty = Object.prototype.hasOwnProperty,</span>&nbsp; <span class='diff-add'> i,</span>&nbsp; <span class='diff-add'> YEAR = 0,</span>&nbsp; <span class='diff-add'> MONTH = 1,</span>&nbsp; <span class='diff-add'> DATE = 2,</span>&nbsp; <span class='diff-add'> HOUR = 3,</span>&nbsp; <span class='diff-add'> MINUTE = 4,</span>&nbsp; <span class='diff-add'> SECOND = 5,</span>&nbsp; <span class='diff-add'> MILLISECOND = 6,</span>&nbsp; <span class='diff-add'> // internal storage for locale config files</span>&nbsp; <span class='diff-add'> locales = {},</span>&nbsp; <span class='diff-add'> // extra moment internal properties (plugins register props here)</span>&nbsp; <span class='diff-add'> momentProperties = [],</span>&nbsp; <span class='diff-add'> // check for nodeJS</span>&nbsp; <span class='diff-add'> hasModule = (typeof module !== 'undefined' && module && module.exports),</span>&nbsp; <span class='diff-add'> // ASP.NET json date format regex</span>&nbsp; <span class='diff-add'> aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,</span>&nbsp; <span class='diff-add'> aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,</span>&nbsp; <span class='diff-add'> // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html</span>&nbsp; <span class='diff-add'> // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere</span>&nbsp; <span class='diff-add'> isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,</span>&nbsp; <span class='diff-add'> // format tokens</span>&nbsp; <span class='diff-add'> formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,</span>&nbsp; <span class='diff-add'> localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,</span>&nbsp; <span class='diff-add'> // parsing token regexes</span>&nbsp; <span class='diff-add'> parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99</span>&nbsp; <span class='diff-add'> parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999</span>&nbsp; <span class='diff-add'> parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999</span>&nbsp; <span class='diff-add'> parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999</span>&nbsp; <span class='diff-add'> parseTokenDigits = /\d+/, // nonzero number of digits</span>&nbsp; <span class='diff-add'> parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.</span>&nbsp; <span class='diff-add'> parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z</span>&nbsp; <span class='diff-add'> parseTokenT = /T/i, // T (ISO separator)</span>&nbsp; <span class='diff-add'> parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123</span>&nbsp; <span class='diff-add'> parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123</span>&nbsp; <span class='diff-add'> //strict parsing regexes</span>&nbsp; <span class='diff-add'> parseTokenOneDigit = /\d/, // 0 - 9</span>&nbsp; <span class='diff-add'> parseTokenTwoDigits = /\d\d/, // 00 - 99</span>&nbsp; <span class='diff-add'> parseTokenThreeDigits = /\d{3}/, // 000 - 999</span>&nbsp; <span class='diff-add'> parseTokenFourDigits = /\d{4}/, // 0000 - 9999</span>&nbsp; <span class='diff-add'> parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999</span>&nbsp; <span class='diff-add'> parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf</span>&nbsp; <span class='diff-add'> // iso 8601 regex</span>&nbsp; <span class='diff-add'> // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)</span>&nbsp; <span class='diff-add'> isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,</span>&nbsp; <span class='diff-add'> isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',</span>&nbsp; <span class='diff-add'> isoDates = [</span>&nbsp; <span class='diff-add'> ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],</span>&nbsp; <span class='diff-add'> ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],</span>&nbsp; <span class='diff-add'> ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],</span>&nbsp; <span class='diff-add'> ['GGGG-[W]WW', /\d{4}-W\d{2}/],</span>&nbsp; <span class='diff-add'> ['YYYY-DDD', /\d{4}-\d{3}/]</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> // iso time formats and regexes</span>&nbsp; <span class='diff-add'> isoTimes = [</span>&nbsp; <span class='diff-add'> ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/],</span>&nbsp; <span class='diff-add'> ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],</span>&nbsp; <span class='diff-add'> ['HH:mm', /(T| )\d\d:\d\d/],</span>&nbsp; <span class='diff-add'> ['HH', /(T| )\d\d/]</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-15', '30']</span>&nbsp; <span class='diff-add'> parseTimezoneChunker = /([\+\-]|\d\d)/gi,</span>&nbsp; <span class='diff-add'> // getter and setter names</span>&nbsp; <span class='diff-add'> proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),</span>&nbsp; <span class='diff-add'> unitMillisecondFactors = {</span>&nbsp; <span class='diff-add'> 'Milliseconds' : 1,</span>&nbsp; <span class='diff-add'> 'Seconds' : 1e3,</span>&nbsp; <span class='diff-add'> 'Minutes' : 6e4,</span>&nbsp; <span class='diff-add'> 'Hours' : 36e5,</span>&nbsp; <span class='diff-add'> 'Days' : 864e5,</span>&nbsp; <span class='diff-add'> 'Months' : 2592e6,</span>&nbsp; <span class='diff-add'> 'Years' : 31536e6</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> unitAliases = {</span>&nbsp; <span class='diff-add'> ms : 'millisecond',</span>&nbsp; <span class='diff-add'> s : 'second',</span>&nbsp; <span class='diff-add'> m : 'minute',</span>&nbsp; <span class='diff-add'> h : 'hour',</span>&nbsp; <span class='diff-add'> d : 'day',</span>&nbsp; <span class='diff-add'> D : 'date',</span>&nbsp; <span class='diff-add'> w : 'week',</span>&nbsp; <span class='diff-add'> W : 'isoWeek',</span>&nbsp; <span class='diff-add'> M : 'month',</span>&nbsp; <span class='diff-add'> Q : 'quarter',</span>&nbsp; <span class='diff-add'> y : 'year',</span>&nbsp; <span class='diff-add'> DDD : 'dayOfYear',</span>&nbsp; <span class='diff-add'> e : 'weekday',</span>&nbsp; <span class='diff-add'> E : 'isoWeekday',</span>&nbsp; <span class='diff-add'> gg: 'weekYear',</span>&nbsp; <span class='diff-add'> GG: 'isoWeekYear'</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> camelFunctions = {</span>&nbsp; <span class='diff-add'> dayofyear : 'dayOfYear',</span>&nbsp; <span class='diff-add'> isoweekday : 'isoWeekday',</span>&nbsp; <span class='diff-add'> isoweek : 'isoWeek',</span>&nbsp; <span class='diff-add'> weekyear : 'weekYear',</span>&nbsp; <span class='diff-add'> isoweekyear : 'isoWeekYear'</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> // format function strings</span>&nbsp; <span class='diff-add'> formatFunctions = {},</span>&nbsp; <span class='diff-add'> // default relative time thresholds</span>&nbsp; <span class='diff-add'> relativeTimeThresholds = {</span>&nbsp; <span class='diff-add'> s: 45, // seconds to minute</span>&nbsp; <span class='diff-add'> m: 45, // minutes to hour</span>&nbsp; <span class='diff-add'> h: 22, // hours to day</span>&nbsp; <span class='diff-add'> d: 26, // days to month</span>&nbsp; <span class='diff-add'> M: 11 // months to year</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> // tokens to ordinalize and pad</span>&nbsp; <span class='diff-add'> ordinalizeTokens = 'DDD w W M D d'.split(' '),</span>&nbsp; <span class='diff-add'> paddedTokens = 'M D H h m s w W'.split(' '),</span>&nbsp; <span class='diff-add'> formatTokenFunctions = {</span>&nbsp; <span class='diff-add'> M : function () {</span>&nbsp; <span class='diff-add'> return this.month() + 1;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> MMM : function (format) {</span>&nbsp; <span class='diff-add'> return this.localeData().monthsShort(this, format);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> MMMM : function (format) {</span>&nbsp; <span class='diff-add'> return this.localeData().months(this, format);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> D : function () {</span>&nbsp; <span class='diff-add'> return this.date();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> DDD : function () {</span>&nbsp; <span class='diff-add'> return this.dayOfYear();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> d : function () {</span>&nbsp; <span class='diff-add'> return this.day();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> dd : function (format) {</span>&nbsp; <span class='diff-add'> return this.localeData().weekdaysMin(this, format);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> ddd : function (format) {</span>&nbsp; <span class='diff-add'> return this.localeData().weekdaysShort(this, format);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> dddd : function (format) {</span>&nbsp; <span class='diff-add'> return this.localeData().weekdays(this, format);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> w : function () {</span>&nbsp; <span class='diff-add'> return this.week();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> W : function () {</span>&nbsp; <span class='diff-add'> return this.isoWeek();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> YY : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(this.year() % 100, 2);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> YYYY : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(this.year(), 4);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> YYYYY : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(this.year(), 5);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> YYYYYY : function () {</span>&nbsp; <span class='diff-add'> var y = this.year(), sign = y >= 0 ? '+' : '-';</span>&nbsp; <span class='diff-add'> return sign + leftZeroFill(Math.abs(y), 6);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> gg : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(this.weekYear() % 100, 2);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> gggg : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(this.weekYear(), 4);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> ggggg : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(this.weekYear(), 5);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> GG : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(this.isoWeekYear() % 100, 2);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> GGGG : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(this.isoWeekYear(), 4);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> GGGGG : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(this.isoWeekYear(), 5);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> e : function () {</span>&nbsp; <span class='diff-add'> return this.weekday();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> E : function () {</span>&nbsp; <span class='diff-add'> return this.isoWeekday();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> a : function () {</span>&nbsp; <span class='diff-add'> return this.localeData().meridiem(this.hours(), this.minutes(), true);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> A : function () {</span>&nbsp; <span class='diff-add'> return this.localeData().meridiem(this.hours(), this.minutes(), false);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> H : function () {</span>&nbsp; <span class='diff-add'> return this.hours();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> h : function () {</span>&nbsp; <span class='diff-add'> return this.hours() % 12 || 12;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> m : function () {</span>&nbsp; <span class='diff-add'> return this.minutes();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> s : function () {</span>&nbsp; <span class='diff-add'> return this.seconds();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> S : function () {</span>&nbsp; <span class='diff-add'> return toInt(this.milliseconds() / 100);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> SS : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(toInt(this.milliseconds() / 10), 2);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> SSS : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(this.milliseconds(), 3);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> SSSS : function () {</span>&nbsp; <span class='diff-add'> return leftZeroFill(this.milliseconds(), 3);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> Z : function () {</span>&nbsp; <span class='diff-add'> var a = -this.zone(),</span>&nbsp; <span class='diff-add'> b = '+';</span>&nbsp; <span class='diff-add'> if (a < 0) {</span>&nbsp; <span class='diff-add'> a = -a;</span>&nbsp; <span class='diff-add'> b = '-';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> ZZ : function () {</span>&nbsp; <span class='diff-add'> var a = -this.zone(),</span>&nbsp; <span class='diff-add'> b = '+';</span>&nbsp; <span class='diff-add'> if (a < 0) {</span>&nbsp; <span class='diff-add'> a = -a;</span>&nbsp; <span class='diff-add'> b = '-';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> z : function () {</span>&nbsp; <span class='diff-add'> return this.zoneAbbr();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> zz : function () {</span>&nbsp; <span class='diff-add'> return this.zoneName();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> x : function () {</span>&nbsp; <span class='diff-add'> return this.valueOf();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> X : function () {</span>&nbsp; <span class='diff-add'> return this.unix();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> Q : function () {</span>&nbsp; <span class='diff-add'> return this.quarter();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> deprecations = {},</span>&nbsp; <span class='diff-add'> lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];</span>&nbsp; <span class='diff-add'> // Pick the first defined of two or three arguments. dfl comes from</span>&nbsp; <span class='diff-add'> // default.</span>&nbsp; <span class='diff-add'> function dfl(a, b, c) {</span>&nbsp; <span class='diff-add'> switch (arguments.length) {</span>&nbsp; <span class='diff-add'> case 2: return a != null ? a : b;</span>&nbsp; <span class='diff-add'> case 3: return a != null ? a : b != null ? b : c;</span>&nbsp; <span class='diff-add'> default: throw new Error('Implement me');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function hasOwnProp(a, b) {</span>&nbsp; <span class='diff-add'> return hasOwnProperty.call(a, b);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function defaultParsingFlags() {</span>&nbsp; <span class='diff-add'> // We need to deep clone this object, and es5 standard is not very</span>&nbsp; <span class='diff-add'> // helpful.</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> empty : false,</span>&nbsp; <span class='diff-add'> unusedTokens : [],</span>&nbsp; <span class='diff-add'> unusedInput : [],</span>&nbsp; <span class='diff-add'> overflow : -2,</span>&nbsp; <span class='diff-add'> charsLeftOver : 0,</span>&nbsp; <span class='diff-add'> nullInput : false,</span>&nbsp; <span class='diff-add'> invalidMonth : null,</span>&nbsp; <span class='diff-add'> invalidFormat : false,</span>&nbsp; <span class='diff-add'> userInvalidated : false,</span>&nbsp; <span class='diff-add'> iso: false</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function printMsg(msg) {</span>&nbsp; <span class='diff-add'> if (moment.suppressDeprecationWarnings === false &&</span>&nbsp; <span class='diff-add'> typeof console !== 'undefined' && console.warn) {</span>&nbsp; <span class='diff-add'> console.warn('Deprecation warning: ' + msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function deprecate(msg, fn) {</span>&nbsp; <span class='diff-add'> var firstTime = true;</span>&nbsp; <span class='diff-add'> return extend(function () {</span>&nbsp; <span class='diff-add'> if (firstTime) {</span>&nbsp; <span class='diff-add'> printMsg(msg);</span>&nbsp; <span class='diff-add'> firstTime = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return fn.apply(this, arguments);</span>&nbsp; <span class='diff-add'> }, fn);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function deprecateSimple(name, msg) {</span>&nbsp; <span class='diff-add'> if (!deprecations[name]) {</span>&nbsp; <span class='diff-add'> printMsg(msg);</span>&nbsp; <span class='diff-add'> deprecations[name] = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function padToken(func, count) {</span>&nbsp; <span class='diff-add'> return function (a) {</span>&nbsp; <span class='diff-add'> return leftZeroFill(func.call(this, a), count);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function ordinalizeToken(func, period) {</span>&nbsp; <span class='diff-add'> return function (a) {</span>&nbsp; <span class='diff-add'> return this.localeData().ordinal(func.call(this, a), period);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> while (ordinalizeTokens.length) {</span>&nbsp; <span class='diff-add'> i = ordinalizeTokens.pop();</span>&nbsp; <span class='diff-add'> formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> while (paddedTokens.length) {</span>&nbsp; <span class='diff-add'> i = paddedTokens.pop();</span>&nbsp; <span class='diff-add'> formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Constructors</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> function Locale() {</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Moment prototype object</span>&nbsp; <span class='diff-add'> function Moment(config, skipOverflow) {</span>&nbsp; <span class='diff-add'> if (skipOverflow !== false) {</span>&nbsp; <span class='diff-add'> checkOverflow(config);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> copyConfig(this, config);</span>&nbsp; <span class='diff-add'> this._d = new Date(+config._d);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Duration Constructor</span>&nbsp; <span class='diff-add'> function Duration(duration) {</span>&nbsp; <span class='diff-add'> var normalizedInput = normalizeObjectUnits(duration),</span>&nbsp; <span class='diff-add'> years = normalizedInput.year || 0,</span>&nbsp; <span class='diff-add'> quarters = normalizedInput.quarter || 0,</span>&nbsp; <span class='diff-add'> months = normalizedInput.month || 0,</span>&nbsp; <span class='diff-add'> weeks = normalizedInput.week || 0,</span>&nbsp; <span class='diff-add'> days = normalizedInput.day || 0,</span>&nbsp; <span class='diff-add'> hours = normalizedInput.hour || 0,</span>&nbsp; <span class='diff-add'> minutes = normalizedInput.minute || 0,</span>&nbsp; <span class='diff-add'> seconds = normalizedInput.second || 0,</span>&nbsp; <span class='diff-add'> milliseconds = normalizedInput.millisecond || 0;</span>&nbsp; <span class='diff-add'> // representation for dateAddRemove</span>&nbsp; <span class='diff-add'> this._milliseconds = +milliseconds +</span>&nbsp; <span class='diff-add'> seconds * 1e3 + // 1000</span>&nbsp; <span class='diff-add'> minutes * 6e4 + // 1000 * 60</span>&nbsp; <span class='diff-add'> hours * 36e5; // 1000 * 60 * 60</span>&nbsp; <span class='diff-add'> // Because of dateAddRemove treats 24 hours as different from a</span>&nbsp; <span class='diff-add'> // day when working around DST, we need to store them separately</span>&nbsp; <span class='diff-add'> this._days = +days +</span>&nbsp; <span class='diff-add'> weeks * 7;</span>&nbsp; <span class='diff-add'> // It is impossible translate months into days without knowing</span>&nbsp; <span class='diff-add'> // which months you are are talking about, so we have to store</span>&nbsp; <span class='diff-add'> // it separately.</span>&nbsp; <span class='diff-add'> this._months = +months +</span>&nbsp; <span class='diff-add'> quarters * 3 +</span>&nbsp; <span class='diff-add'> years * 12;</span>&nbsp; <span class='diff-add'> this._data = {};</span>&nbsp; <span class='diff-add'> this._locale = moment.localeData();</span>&nbsp; <span class='diff-add'> this._bubble();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Helpers</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> function extend(a, b) {</span>&nbsp; <span class='diff-add'> for (var i in b) {</span>&nbsp; <span class='diff-add'> if (hasOwnProp(b, i)) {</span>&nbsp; <span class='diff-add'> a[i] = b[i];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (hasOwnProp(b, 'toString')) {</span>&nbsp; <span class='diff-add'> a.toString = b.toString;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (hasOwnProp(b, 'valueOf')) {</span>&nbsp; <span class='diff-add'> a.valueOf = b.valueOf;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return a;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function copyConfig(to, from) {</span>&nbsp; <span class='diff-add'> var i, prop, val;</span>&nbsp; <span class='diff-add'> if (typeof from._isAMomentObject !== 'undefined') {</span>&nbsp; <span class='diff-add'> to._isAMomentObject = from._isAMomentObject;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof from._i !== 'undefined') {</span>&nbsp; <span class='diff-add'> to._i = from._i;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof from._f !== 'undefined') {</span>&nbsp; <span class='diff-add'> to._f = from._f;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof from._l !== 'undefined') {</span>&nbsp; <span class='diff-add'> to._l = from._l;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof from._strict !== 'undefined') {</span>&nbsp; <span class='diff-add'> to._strict = from._strict;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof from._tzm !== 'undefined') {</span>&nbsp; <span class='diff-add'> to._tzm = from._tzm;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof from._isUTC !== 'undefined') {</span>&nbsp; <span class='diff-add'> to._isUTC = from._isUTC;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof from._offset !== 'undefined') {</span>&nbsp; <span class='diff-add'> to._offset = from._offset;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof from._pf !== 'undefined') {</span>&nbsp; <span class='diff-add'> to._pf = from._pf;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof from._locale !== 'undefined') {</span>&nbsp; <span class='diff-add'> to._locale = from._locale;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (momentProperties.length > 0) {</span>&nbsp; <span class='diff-add'> for (i in momentProperties) {</span>&nbsp; <span class='diff-add'> prop = momentProperties[i];</span>&nbsp; <span class='diff-add'> val = from[prop];</span>&nbsp; <span class='diff-add'> if (typeof val !== 'undefined') {</span>&nbsp; <span class='diff-add'> to[prop] = val;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return to;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function absRound(number) {</span>&nbsp; <span class='diff-add'> if (number < 0) {</span>&nbsp; <span class='diff-add'> return Math.ceil(number);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return Math.floor(number);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // left zero fill a number</span>&nbsp; <span class='diff-add'> // see http://jsperf.com/left-zero-filling for performance comparison</span>&nbsp; <span class='diff-add'> function leftZeroFill(number, targetLength, forceSign) {</span>&nbsp; <span class='diff-add'> var output = '' + Math.abs(number),</span>&nbsp; <span class='diff-add'> sign = number >= 0;</span>&nbsp; <span class='diff-add'> while (output.length < targetLength) {</span>&nbsp; <span class='diff-add'> output = '0' + output;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return (sign ? (forceSign ? '+' : '') : '-') + output;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function positiveMomentsDifference(base, other) {</span>&nbsp; <span class='diff-add'> var res = {milliseconds: 0, months: 0};</span>&nbsp; <span class='diff-add'> res.months = other.month() - base.month() +</span>&nbsp; <span class='diff-add'> (other.year() - base.year()) * 12;</span>&nbsp; <span class='diff-add'> if (base.clone().add(res.months, 'M').isAfter(other)) {</span>&nbsp; <span class='diff-add'> --res.months;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> res.milliseconds = +other - +(base.clone().add(res.months, 'M'));</span>&nbsp; <span class='diff-add'> return res;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function momentsDifference(base, other) {</span>&nbsp; <span class='diff-add'> var res;</span>&nbsp; <span class='diff-add'> other = makeAs(other, base);</span>&nbsp; <span class='diff-add'> if (base.isBefore(other)) {</span>&nbsp; <span class='diff-add'> res = positiveMomentsDifference(base, other);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> res = positiveMomentsDifference(other, base);</span>&nbsp; <span class='diff-add'> res.milliseconds = -res.milliseconds;</span>&nbsp; <span class='diff-add'> res.months = -res.months;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return res;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // TODO: remove 'name' arg after deprecation is removed</span>&nbsp; <span class='diff-add'> function createAdder(direction, name) {</span>&nbsp; <span class='diff-add'> return function (val, period) {</span>&nbsp; <span class='diff-add'> var dur, tmp;</span>&nbsp; <span class='diff-add'> //invert the arguments, but complain about it</span>&nbsp; <span class='diff-add'> if (period !== null && !isNaN(+period)) {</span>&nbsp; <span class='diff-add'> deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');</span>&nbsp; <span class='diff-add'> tmp = val; val = period; period = tmp;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> val = typeof val === 'string' ? +val : val;</span>&nbsp; <span class='diff-add'> dur = moment.duration(val, period);</span>&nbsp; <span class='diff-add'> addOrSubtractDurationFromMoment(this, dur, direction);</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) {</span>&nbsp; <span class='diff-add'> var milliseconds = duration._milliseconds,</span>&nbsp; <span class='diff-add'> days = duration._days,</span>&nbsp; <span class='diff-add'> months = duration._months;</span>&nbsp; <span class='diff-add'> updateOffset = updateOffset == null ? true : updateOffset;</span>&nbsp; <span class='diff-add'> if (milliseconds) {</span>&nbsp; <span class='diff-add'> mom._d.setTime(+mom._d + milliseconds * isAdding);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (days) {</span>&nbsp; <span class='diff-add'> rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (months) {</span>&nbsp; <span class='diff-add'> rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (updateOffset) {</span>&nbsp; <span class='diff-add'> moment.updateOffset(mom, days || months);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // check if is an array</span>&nbsp; <span class='diff-add'> function isArray(input) {</span>&nbsp; <span class='diff-add'> return Object.prototype.toString.call(input) === '[object Array]';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function isDate(input) {</span>&nbsp; <span class='diff-add'> return Object.prototype.toString.call(input) === '[object Date]' ||</span>&nbsp; <span class='diff-add'> input instanceof Date;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // compare two arrays, return the number of differences</span>&nbsp; <span class='diff-add'> function compareArrays(array1, array2, dontConvert) {</span>&nbsp; <span class='diff-add'> var len = Math.min(array1.length, array2.length),</span>&nbsp; <span class='diff-add'> lengthDiff = Math.abs(array1.length - array2.length),</span>&nbsp; <span class='diff-add'> diffs = 0,</span>&nbsp; <span class='diff-add'> i;</span>&nbsp; <span class='diff-add'> for (i = 0; i < len; i++) {</span>&nbsp; <span class='diff-add'> if ((dontConvert && array1[i] !== array2[i]) ||</span>&nbsp; <span class='diff-add'> (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {</span>&nbsp; <span class='diff-add'> diffs++;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return diffs + lengthDiff;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function normalizeUnits(units) {</span>&nbsp; <span class='diff-add'> if (units) {</span>&nbsp; <span class='diff-add'> var lowered = units.toLowerCase().replace(/(.)s$/, '$1');</span>&nbsp; <span class='diff-add'> units = unitAliases[units] || camelFunctions[lowered] || lowered;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return units;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function normalizeObjectUnits(inputObject) {</span>&nbsp; <span class='diff-add'> var normalizedInput = {},</span>&nbsp; <span class='diff-add'> normalizedProp,</span>&nbsp; <span class='diff-add'> prop;</span>&nbsp; <span class='diff-add'> for (prop in inputObject) {</span>&nbsp; <span class='diff-add'> if (hasOwnProp(inputObject, prop)) {</span>&nbsp; <span class='diff-add'> normalizedProp = normalizeUnits(prop);</span>&nbsp; <span class='diff-add'> if (normalizedProp) {</span>&nbsp; <span class='diff-add'> normalizedInput[normalizedProp] = inputObject[prop];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return normalizedInput;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function makeList(field) {</span>&nbsp; <span class='diff-add'> var count, setter;</span>&nbsp; <span class='diff-add'> if (field.indexOf('week') === 0) {</span>&nbsp; <span class='diff-add'> count = 7;</span>&nbsp; <span class='diff-add'> setter = 'day';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else if (field.indexOf('month') === 0) {</span>&nbsp; <span class='diff-add'> count = 12;</span>&nbsp; <span class='diff-add'> setter = 'month';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> moment[field] = function (format, index) {</span>&nbsp; <span class='diff-add'> var i, getter,</span>&nbsp; <span class='diff-add'> method = moment._locale[field],</span>&nbsp; <span class='diff-add'> results = [];</span>&nbsp; <span class='diff-add'> if (typeof format === 'number') {</span>&nbsp; <span class='diff-add'> index = format;</span>&nbsp; <span class='diff-add'> format = undefined;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> getter = function (i) {</span>&nbsp; <span class='diff-add'> var m = moment().utc().set(setter, i);</span>&nbsp; <span class='diff-add'> return method.call(moment._locale, m, format || '');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (index != null) {</span>&nbsp; <span class='diff-add'> return getter(index);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> for (i = 0; i < count; i++) {</span>&nbsp; <span class='diff-add'> results.push(getter(i));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return results;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function toInt(argumentForCoercion) {</span>&nbsp; <span class='diff-add'> var coercedNumber = +argumentForCoercion,</span>&nbsp; <span class='diff-add'> value = 0;</span>&nbsp; <span class='diff-add'> if (coercedNumber !== 0 && isFinite(coercedNumber)) {</span>&nbsp; <span class='diff-add'> if (coercedNumber >= 0) {</span>&nbsp; <span class='diff-add'> value = Math.floor(coercedNumber);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> value = Math.ceil(coercedNumber);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return value;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function daysInMonth(year, month) {</span>&nbsp; <span class='diff-add'> return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function weeksInYear(year, dow, doy) {</span>&nbsp; <span class='diff-add'> return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function daysInYear(year) {</span>&nbsp; <span class='diff-add'> return isLeapYear(year) ? 366 : 365;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function isLeapYear(year) {</span>&nbsp; <span class='diff-add'> return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function checkOverflow(m) {</span>&nbsp; <span class='diff-add'> var overflow;</span>&nbsp; <span class='diff-add'> if (m._a && m._pf.overflow === -2) {</span>&nbsp; <span class='diff-add'> overflow =</span>&nbsp; <span class='diff-add'> m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :</span>&nbsp; <span class='diff-add'> m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :</span>&nbsp; <span class='diff-add'> m._a[HOUR] < 0 || m._a[HOUR] > 24 ||</span>&nbsp; <span class='diff-add'> (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 ||</span>&nbsp; <span class='diff-add'> m._a[SECOND] !== 0 ||</span>&nbsp; <span class='diff-add'> m._a[MILLISECOND] !== 0)) ? HOUR :</span>&nbsp; <span class='diff-add'> m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :</span>&nbsp; <span class='diff-add'> m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :</span>&nbsp; <span class='diff-add'> m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :</span>&nbsp; <span class='diff-add'> -1;</span>&nbsp; <span class='diff-add'> if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {</span>&nbsp; <span class='diff-add'> overflow = DATE;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> m._pf.overflow = overflow;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function isValid(m) {</span>&nbsp; <span class='diff-add'> if (m._isValid == null) {</span>&nbsp; <span class='diff-add'> m._isValid = !isNaN(m._d.getTime()) &&</span>&nbsp; <span class='diff-add'> m._pf.overflow < 0 &&</span>&nbsp; <span class='diff-add'> !m._pf.empty &&</span>&nbsp; <span class='diff-add'> !m._pf.invalidMonth &&</span>&nbsp; <span class='diff-add'> !m._pf.nullInput &&</span>&nbsp; <span class='diff-add'> !m._pf.invalidFormat &&</span>&nbsp; <span class='diff-add'> !m._pf.userInvalidated;</span>&nbsp; <span class='diff-add'> if (m._strict) {</span>&nbsp; <span class='diff-add'> m._isValid = m._isValid &&</span>&nbsp; <span class='diff-add'> m._pf.charsLeftOver === 0 &&</span>&nbsp; <span class='diff-add'> m._pf.unusedTokens.length === 0 &&</span>&nbsp; <span class='diff-add'> m._pf.bigHour === undefined;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return m._isValid;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function normalizeLocale(key) {</span>&nbsp; <span class='diff-add'> return key ? key.toLowerCase().replace('_', '-') : key;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // pick the locale from the array</span>&nbsp; <span class='diff-add'> // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each</span>&nbsp; <span class='diff-add'> // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root</span>&nbsp; <span class='diff-add'> function chooseLocale(names) {</span>&nbsp; <span class='diff-add'> var i = 0, j, next, locale, split;</span>&nbsp; <span class='diff-add'> while (i < names.length) {</span>&nbsp; <span class='diff-add'> split = normalizeLocale(names[i]).split('-');</span>&nbsp; <span class='diff-add'> j = split.length;</span>&nbsp; <span class='diff-add'> next = normalizeLocale(names[i + 1]);</span>&nbsp; <span class='diff-add'> next = next ? next.split('-') : null;</span>&nbsp; <span class='diff-add'> while (j > 0) {</span>&nbsp; <span class='diff-add'> locale = loadLocale(split.slice(0, j).join('-'));</span>&nbsp; <span class='diff-add'> if (locale) {</span>&nbsp; <span class='diff-add'> return locale;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {</span>&nbsp; <span class='diff-add'> //the next array item is better than a shallower substring of this one</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> j--;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> i++;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function loadLocale(name) {</span>&nbsp; <span class='diff-add'> var oldLocale = null;</span>&nbsp; <span class='diff-add'> if (!locales[name] && hasModule) {</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> oldLocale = moment.locale();</span>&nbsp; <span class='diff-add'> require('./locale/' + name);</span>&nbsp; <span class='diff-add'> // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales</span>&nbsp; <span class='diff-add'> moment.locale(oldLocale);</span>&nbsp; <span class='diff-add'> } catch (e) { }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return locales[name];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Return a moment from input, that is local/utc/zone equivalent to model.</span>&nbsp; <span class='diff-add'> function makeAs(input, model) {</span>&nbsp; <span class='diff-add'> var res, diff;</span>&nbsp; <span class='diff-add'> if (model._isUTC) {</span>&nbsp; <span class='diff-add'> res = model.clone();</span>&nbsp; <span class='diff-add'> diff = (moment.isMoment(input) || isDate(input) ?</span>&nbsp; <span class='diff-add'> +input : +moment(input)) - (+res);</span>&nbsp; <span class='diff-add'> // Use low-level api, because this fn is low-level api.</span>&nbsp; <span class='diff-add'> res._d.setTime(+res._d + diff);</span>&nbsp; <span class='diff-add'> moment.updateOffset(res, false);</span>&nbsp; <span class='diff-add'> return res;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return moment(input).local();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Locale</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> extend(Locale.prototype, {</span>&nbsp; <span class='diff-add'> set : function (config) {</span>&nbsp; <span class='diff-add'> var prop, i;</span>&nbsp; <span class='diff-add'> for (i in config) {</span>&nbsp; <span class='diff-add'> prop = config[i];</span>&nbsp; <span class='diff-add'> if (typeof prop === 'function') {</span>&nbsp; <span class='diff-add'> this[i] = prop;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this['_' + i] = prop;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Lenient ordinal parsing accepts just a number in addition to</span>&nbsp; <span class='diff-add'> // number + (possibly) stuff coming from _ordinalParseLenient.</span>&nbsp; <span class='diff-add'> this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),</span>&nbsp; <span class='diff-add'> months : function (m) {</span>&nbsp; <span class='diff-add'> return this._months[m.month()];</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),</span>&nbsp; <span class='diff-add'> monthsShort : function (m) {</span>&nbsp; <span class='diff-add'> return this._monthsShort[m.month()];</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> monthsParse : function (monthName, format, strict) {</span>&nbsp; <span class='diff-add'> var i, mom, regex;</span>&nbsp; <span class='diff-add'> if (!this._monthsParse) {</span>&nbsp; <span class='diff-add'> this._monthsParse = [];</span>&nbsp; <span class='diff-add'> this._longMonthsParse = [];</span>&nbsp; <span class='diff-add'> this._shortMonthsParse = [];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (i = 0; i < 12; i++) {</span>&nbsp; <span class='diff-add'> // make the regex if we don't have it already</span>&nbsp; <span class='diff-add'> mom = moment.utc([2000, i]);</span>&nbsp; <span class='diff-add'> if (strict && !this._longMonthsParse[i]) {</span>&nbsp; <span class='diff-add'> this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');</span>&nbsp; <span class='diff-add'> this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!strict && !this._monthsParse[i]) {</span>&nbsp; <span class='diff-add'> regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');</span>&nbsp; <span class='diff-add'> this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // test the regex</span>&nbsp; <span class='diff-add'> if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {</span>&nbsp; <span class='diff-add'> return i;</span>&nbsp; <span class='diff-add'> } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {</span>&nbsp; <span class='diff-add'> return i;</span>&nbsp; <span class='diff-add'> } else if (!strict && this._monthsParse[i].test(monthName)) {</span>&nbsp; <span class='diff-add'> return i;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),</span>&nbsp; <span class='diff-add'> weekdays : function (m) {</span>&nbsp; <span class='diff-add'> return this._weekdays[m.day()];</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),</span>&nbsp; <span class='diff-add'> weekdaysShort : function (m) {</span>&nbsp; <span class='diff-add'> return this._weekdaysShort[m.day()];</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),</span>&nbsp; <span class='diff-add'> weekdaysMin : function (m) {</span>&nbsp; <span class='diff-add'> return this._weekdaysMin[m.day()];</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> weekdaysParse : function (weekdayName) {</span>&nbsp; <span class='diff-add'> var i, mom, regex;</span>&nbsp; <span class='diff-add'> if (!this._weekdaysParse) {</span>&nbsp; <span class='diff-add'> this._weekdaysParse = [];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (i = 0; i < 7; i++) {</span>&nbsp; <span class='diff-add'> // make the regex if we don't have it already</span>&nbsp; <span class='diff-add'> if (!this._weekdaysParse[i]) {</span>&nbsp; <span class='diff-add'> mom = moment([2000, 1]).day(i);</span>&nbsp; <span class='diff-add'> regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');</span>&nbsp; <span class='diff-add'> this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // test the regex</span>&nbsp; <span class='diff-add'> if (this._weekdaysParse[i].test(weekdayName)) {</span>&nbsp; <span class='diff-add'> return i;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _longDateFormat : {</span>&nbsp; <span class='diff-add'> LTS : 'h:mm:ss A',</span>&nbsp; <span class='diff-add'> LT : 'h:mm A',</span>&nbsp; <span class='diff-add'> L : 'MM/DD/YYYY',</span>&nbsp; <span class='diff-add'> LL : 'MMMM D, YYYY',</span>&nbsp; <span class='diff-add'> LLL : 'MMMM D, YYYY LT',</span>&nbsp; <span class='diff-add'> LLLL : 'dddd, MMMM D, YYYY LT'</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> longDateFormat : function (key) {</span>&nbsp; <span class='diff-add'> var output = this._longDateFormat[key];</span>&nbsp; <span class='diff-add'> if (!output && this._longDateFormat[key.toUpperCase()]) {</span>&nbsp; <span class='diff-add'> output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {</span>&nbsp; <span class='diff-add'> return val.slice(1);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this._longDateFormat[key] = output;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return output;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isPM : function (input) {</span>&nbsp; <span class='diff-add'> // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays</span>&nbsp; <span class='diff-add'> // Using charAt should be more compatible.</span>&nbsp; <span class='diff-add'> return ((input + '').toLowerCase().charAt(0) === 'p');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _meridiemParse : /[ap]\.?m?\.?/i,</span>&nbsp; <span class='diff-add'> meridiem : function (hours, minutes, isLower) {</span>&nbsp; <span class='diff-add'> if (hours > 11) {</span>&nbsp; <span class='diff-add'> return isLower ? 'pm' : 'PM';</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return isLower ? 'am' : 'AM';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _calendar : {</span>&nbsp; <span class='diff-add'> sameDay : '[Today at] LT',</span>&nbsp; <span class='diff-add'> nextDay : '[Tomorrow at] LT',</span>&nbsp; <span class='diff-add'> nextWeek : 'dddd [at] LT',</span>&nbsp; <span class='diff-add'> lastDay : '[Yesterday at] LT',</span>&nbsp; <span class='diff-add'> lastWeek : '[Last] dddd [at] LT',</span>&nbsp; <span class='diff-add'> sameElse : 'L'</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> calendar : function (key, mom, now) {</span>&nbsp; <span class='diff-add'> var output = this._calendar[key];</span>&nbsp; <span class='diff-add'> return typeof output === 'function' ? output.apply(mom, [now]) : output;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _relativeTime : {</span>&nbsp; <span class='diff-add'> future : 'in %s',</span>&nbsp; <span class='diff-add'> past : '%s ago',</span>&nbsp; <span class='diff-add'> s : 'a few seconds',</span>&nbsp; <span class='diff-add'> m : 'a minute',</span>&nbsp; <span class='diff-add'> mm : '%d minutes',</span>&nbsp; <span class='diff-add'> h : 'an hour',</span>&nbsp; <span class='diff-add'> hh : '%d hours',</span>&nbsp; <span class='diff-add'> d : 'a day',</span>&nbsp; <span class='diff-add'> dd : '%d days',</span>&nbsp; <span class='diff-add'> M : 'a month',</span>&nbsp; <span class='diff-add'> MM : '%d months',</span>&nbsp; <span class='diff-add'> y : 'a year',</span>&nbsp; <span class='diff-add'> yy : '%d years'</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> relativeTime : function (number, withoutSuffix, string, isFuture) {</span>&nbsp; <span class='diff-add'> var output = this._relativeTime[string];</span>&nbsp; <span class='diff-add'> return (typeof output === 'function') ?</span>&nbsp; <span class='diff-add'> output(number, withoutSuffix, string, isFuture) :</span>&nbsp; <span class='diff-add'> output.replace(/%d/i, number);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> pastFuture : function (diff, output) {</span>&nbsp; <span class='diff-add'> var format = this._relativeTime[diff > 0 ? 'future' : 'past'];</span>&nbsp; <span class='diff-add'> return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> ordinal : function (number) {</span>&nbsp; <span class='diff-add'> return this._ordinal.replace('%d', number);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _ordinal : '%d',</span>&nbsp; <span class='diff-add'> _ordinalParse : /\d{1,2}/,</span>&nbsp; <span class='diff-add'> preparse : function (string) {</span>&nbsp; <span class='diff-add'> return string;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> postformat : function (string) {</span>&nbsp; <span class='diff-add'> return string;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> week : function (mom) {</span>&nbsp; <span class='diff-add'> return weekOfYear(mom, this._week.dow, this._week.doy).week;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _week : {</span>&nbsp; <span class='diff-add'> dow : 0, // Sunday is the first day of the week.</span>&nbsp; <span class='diff-add'> doy : 6 // The week that contains Jan 1st is the first week of the year.</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _invalidDate: 'Invalid date',</span>&nbsp; <span class='diff-add'> invalidDate: function () {</span>&nbsp; <span class='diff-add'> return this._invalidDate;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Formatting</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> function removeFormattingTokens(input) {</span>&nbsp; <span class='diff-add'> if (input.match(/\[[\s\S]/)) {</span>&nbsp; <span class='diff-add'> return input.replace(/^\[|\]$/g, '');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return input.replace(/\\/g, '');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function makeFormatFunction(format) {</span>&nbsp; <span class='diff-add'> var array = format.match(formattingTokens), i, length;</span>&nbsp; <span class='diff-add'> for (i = 0, length = array.length; i < length; i++) {</span>&nbsp; <span class='diff-add'> if (formatTokenFunctions[array[i]]) {</span>&nbsp; <span class='diff-add'> array[i] = formatTokenFunctions[array[i]];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> array[i] = removeFormattingTokens(array[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return function (mom) {</span>&nbsp; <span class='diff-add'> var output = '';</span>&nbsp; <span class='diff-add'> for (i = 0; i < length; i++) {</span>&nbsp; <span class='diff-add'> output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return output;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // format date using native date object</span>&nbsp; <span class='diff-add'> function formatMoment(m, format) {</span>&nbsp; <span class='diff-add'> if (!m.isValid()) {</span>&nbsp; <span class='diff-add'> return m.localeData().invalidDate();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> format = expandFormat(format, m.localeData());</span>&nbsp; <span class='diff-add'> if (!formatFunctions[format]) {</span>&nbsp; <span class='diff-add'> formatFunctions[format] = makeFormatFunction(format);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return formatFunctions[format](m);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function expandFormat(format, locale) {</span>&nbsp; <span class='diff-add'> var i = 5;</span>&nbsp; <span class='diff-add'> function replaceLongDateFormatTokens(input) {</span>&nbsp; <span class='diff-add'> return locale.longDateFormat(input) || input;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> localFormattingTokens.lastIndex = 0;</span>&nbsp; <span class='diff-add'> while (i >= 0 && localFormattingTokens.test(format)) {</span>&nbsp; <span class='diff-add'> format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);</span>&nbsp; <span class='diff-add'> localFormattingTokens.lastIndex = 0;</span>&nbsp; <span class='diff-add'> i -= 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return format;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Parsing</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> // get the regex to find the next token</span>&nbsp; <span class='diff-add'> function getParseRegexForToken(token, config) {</span>&nbsp; <span class='diff-add'> var a, strict = config._strict;</span>&nbsp; <span class='diff-add'> switch (token) {</span>&nbsp; <span class='diff-add'> case 'Q':</span>&nbsp; <span class='diff-add'> return parseTokenOneDigit;</span>&nbsp; <span class='diff-add'> case 'DDDD':</span>&nbsp; <span class='diff-add'> return parseTokenThreeDigits;</span>&nbsp; <span class='diff-add'> case 'YYYY':</span>&nbsp; <span class='diff-add'> case 'GGGG':</span>&nbsp; <span class='diff-add'> case 'gggg':</span>&nbsp; <span class='diff-add'> return strict ? parseTokenFourDigits : parseTokenOneToFourDigits;</span>&nbsp; <span class='diff-add'> case 'Y':</span>&nbsp; <span class='diff-add'> case 'G':</span>&nbsp; <span class='diff-add'> case 'g':</span>&nbsp; <span class='diff-add'> return parseTokenSignedNumber;</span>&nbsp; <span class='diff-add'> case 'YYYYYY':</span>&nbsp; <span class='diff-add'> case 'YYYYY':</span>&nbsp; <span class='diff-add'> case 'GGGGG':</span>&nbsp; <span class='diff-add'> case 'ggggg':</span>&nbsp; <span class='diff-add'> return strict ? parseTokenSixDigits : parseTokenOneToSixDigits;</span>&nbsp; <span class='diff-add'> case 'S':</span>&nbsp; <span class='diff-add'> if (strict) {</span>&nbsp; <span class='diff-add'> return parseTokenOneDigit;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /* falls through */</span>&nbsp; <span class='diff-add'> case 'SS':</span>&nbsp; <span class='diff-add'> if (strict) {</span>&nbsp; <span class='diff-add'> return parseTokenTwoDigits;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /* falls through */</span>&nbsp; <span class='diff-add'> case 'SSS':</span>&nbsp; <span class='diff-add'> if (strict) {</span>&nbsp; <span class='diff-add'> return parseTokenThreeDigits;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /* falls through */</span>&nbsp; <span class='diff-add'> case 'DDD':</span>&nbsp; <span class='diff-add'> return parseTokenOneToThreeDigits;</span>&nbsp; <span class='diff-add'> case 'MMM':</span>&nbsp; <span class='diff-add'> case 'MMMM':</span>&nbsp; <span class='diff-add'> case 'dd':</span>&nbsp; <span class='diff-add'> case 'ddd':</span>&nbsp; <span class='diff-add'> case 'dddd':</span>&nbsp; <span class='diff-add'> return parseTokenWord;</span>&nbsp; <span class='diff-add'> case 'a':</span>&nbsp; <span class='diff-add'> case 'A':</span>&nbsp; <span class='diff-add'> return config._locale._meridiemParse;</span>&nbsp; <span class='diff-add'> case 'x':</span>&nbsp; <span class='diff-add'> return parseTokenOffsetMs;</span>&nbsp; <span class='diff-add'> case 'X':</span>&nbsp; <span class='diff-add'> return parseTokenTimestampMs;</span>&nbsp; <span class='diff-add'> case 'Z':</span>&nbsp; <span class='diff-add'> case 'ZZ':</span>&nbsp; <span class='diff-add'> return parseTokenTimezone;</span>&nbsp; <span class='diff-add'> case 'T':</span>&nbsp; <span class='diff-add'> return parseTokenT;</span>&nbsp; <span class='diff-add'> case 'SSSS':</span>&nbsp; <span class='diff-add'> return parseTokenDigits;</span>&nbsp; <span class='diff-add'> case 'MM':</span>&nbsp; <span class='diff-add'> case 'DD':</span>&nbsp; <span class='diff-add'> case 'YY':</span>&nbsp; <span class='diff-add'> case 'GG':</span>&nbsp; <span class='diff-add'> case 'gg':</span>&nbsp; <span class='diff-add'> case 'HH':</span>&nbsp; <span class='diff-add'> case 'hh':</span>&nbsp; <span class='diff-add'> case 'mm':</span>&nbsp; <span class='diff-add'> case 'ss':</span>&nbsp; <span class='diff-add'> case 'ww':</span>&nbsp; <span class='diff-add'> case 'WW':</span>&nbsp; <span class='diff-add'> return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits;</span>&nbsp; <span class='diff-add'> case 'M':</span>&nbsp; <span class='diff-add'> case 'D':</span>&nbsp; <span class='diff-add'> case 'd':</span>&nbsp; <span class='diff-add'> case 'H':</span>&nbsp; <span class='diff-add'> case 'h':</span>&nbsp; <span class='diff-add'> case 'm':</span>&nbsp; <span class='diff-add'> case 's':</span>&nbsp; <span class='diff-add'> case 'w':</span>&nbsp; <span class='diff-add'> case 'W':</span>&nbsp; <span class='diff-add'> case 'e':</span>&nbsp; <span class='diff-add'> case 'E':</span>&nbsp; <span class='diff-add'> return parseTokenOneOrTwoDigits;</span>&nbsp; <span class='diff-add'> case 'Do':</span>&nbsp; <span class='diff-add'> return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient;</span>&nbsp; <span class='diff-add'> default :</span>&nbsp; <span class='diff-add'> a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i'));</span>&nbsp; <span class='diff-add'> return a;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function timezoneMinutesFromString(string) {</span>&nbsp; <span class='diff-add'> string = string || '';</span>&nbsp; <span class='diff-add'> var possibleTzMatches = (string.match(parseTokenTimezone) || []),</span>&nbsp; <span class='diff-add'> tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [],</span>&nbsp; <span class='diff-add'> parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0],</span>&nbsp; <span class='diff-add'> minutes = +(parts[1] * 60) + toInt(parts[2]);</span>&nbsp; <span class='diff-add'> return parts[0] === '+' ? -minutes : minutes;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // function to convert string input to date</span>&nbsp; <span class='diff-add'> function addTimeToArrayFromToken(token, input, config) {</span>&nbsp; <span class='diff-add'> var a, datePartArray = config._a;</span>&nbsp; <span class='diff-add'> switch (token) {</span>&nbsp; <span class='diff-add'> // QUARTER</span>&nbsp; <span class='diff-add'> case 'Q':</span>&nbsp; <span class='diff-add'> if (input != null) {</span>&nbsp; <span class='diff-add'> datePartArray[MONTH] = (toInt(input) - 1) * 3;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // MONTH</span>&nbsp; <span class='diff-add'> case 'M' : // fall through to MM</span>&nbsp; <span class='diff-add'> case 'MM' :</span>&nbsp; <span class='diff-add'> if (input != null) {</span>&nbsp; <span class='diff-add'> datePartArray[MONTH] = toInt(input) - 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'MMM' : // fall through to MMMM</span>&nbsp; <span class='diff-add'> case 'MMMM' :</span>&nbsp; <span class='diff-add'> a = config._locale.monthsParse(input, token, config._strict);</span>&nbsp; <span class='diff-add'> // if we didn't find a month name, mark the date as invalid.</span>&nbsp; <span class='diff-add'> if (a != null) {</span>&nbsp; <span class='diff-add'> datePartArray[MONTH] = a;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> config._pf.invalidMonth = input;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // DAY OF MONTH</span>&nbsp; <span class='diff-add'> case 'D' : // fall through to DD</span>&nbsp; <span class='diff-add'> case 'DD' :</span>&nbsp; <span class='diff-add'> if (input != null) {</span>&nbsp; <span class='diff-add'> datePartArray[DATE] = toInt(input);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'Do' :</span>&nbsp; <span class='diff-add'> if (input != null) {</span>&nbsp; <span class='diff-add'> datePartArray[DATE] = toInt(parseInt(</span>&nbsp; <span class='diff-add'> input.match(/\d{1,2}/)[0], 10));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // DAY OF YEAR</span>&nbsp; <span class='diff-add'> case 'DDD' : // fall through to DDDD</span>&nbsp; <span class='diff-add'> case 'DDDD' :</span>&nbsp; <span class='diff-add'> if (input != null) {</span>&nbsp; <span class='diff-add'> config._dayOfYear = toInt(input);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // YEAR</span>&nbsp; <span class='diff-add'> case 'YY' :</span>&nbsp; <span class='diff-add'> datePartArray[YEAR] = moment.parseTwoDigitYear(input);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'YYYY' :</span>&nbsp; <span class='diff-add'> case 'YYYYY' :</span>&nbsp; <span class='diff-add'> case 'YYYYYY' :</span>&nbsp; <span class='diff-add'> datePartArray[YEAR] = toInt(input);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // AM / PM</span>&nbsp; <span class='diff-add'> case 'a' : // fall through to A</span>&nbsp; <span class='diff-add'> case 'A' :</span>&nbsp; <span class='diff-add'> config._isPm = config._locale.isPM(input);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // HOUR</span>&nbsp; <span class='diff-add'> case 'h' : // fall through to hh</span>&nbsp; <span class='diff-add'> case 'hh' :</span>&nbsp; <span class='diff-add'> config._pf.bigHour = true;</span>&nbsp; <span class='diff-add'> /* falls through */</span>&nbsp; <span class='diff-add'> case 'H' : // fall through to HH</span>&nbsp; <span class='diff-add'> case 'HH' :</span>&nbsp; <span class='diff-add'> datePartArray[HOUR] = toInt(input);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // MINUTE</span>&nbsp; <span class='diff-add'> case 'm' : // fall through to mm</span>&nbsp; <span class='diff-add'> case 'mm' :</span>&nbsp; <span class='diff-add'> datePartArray[MINUTE] = toInt(input);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // SECOND</span>&nbsp; <span class='diff-add'> case 's' : // fall through to ss</span>&nbsp; <span class='diff-add'> case 'ss' :</span>&nbsp; <span class='diff-add'> datePartArray[SECOND] = toInt(input);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // MILLISECOND</span>&nbsp; <span class='diff-add'> case 'S' :</span>&nbsp; <span class='diff-add'> case 'SS' :</span>&nbsp; <span class='diff-add'> case 'SSS' :</span>&nbsp; <span class='diff-add'> case 'SSSS' :</span>&nbsp; <span class='diff-add'> datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // UNIX OFFSET (MILLISECONDS)</span>&nbsp; <span class='diff-add'> case 'x':</span>&nbsp; <span class='diff-add'> config._d = new Date(toInt(input));</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // UNIX TIMESTAMP WITH MS</span>&nbsp; <span class='diff-add'> case 'X':</span>&nbsp; <span class='diff-add'> config._d = new Date(parseFloat(input) * 1000);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // TIMEZONE</span>&nbsp; <span class='diff-add'> case 'Z' : // fall through to ZZ</span>&nbsp; <span class='diff-add'> case 'ZZ' :</span>&nbsp; <span class='diff-add'> config._useUTC = true;</span>&nbsp; <span class='diff-add'> config._tzm = timezoneMinutesFromString(input);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // WEEKDAY - human</span>&nbsp; <span class='diff-add'> case 'dd':</span>&nbsp; <span class='diff-add'> case 'ddd':</span>&nbsp; <span class='diff-add'> case 'dddd':</span>&nbsp; <span class='diff-add'> a = config._locale.weekdaysParse(input);</span>&nbsp; <span class='diff-add'> // if we didn't get a weekday name, mark the date as invalid</span>&nbsp; <span class='diff-add'> if (a != null) {</span>&nbsp; <span class='diff-add'> config._w = config._w || {};</span>&nbsp; <span class='diff-add'> config._w['d'] = a;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> config._pf.invalidWeekday = input;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> // WEEK, WEEK DAY - numeric</span>&nbsp; <span class='diff-add'> case 'w':</span>&nbsp; <span class='diff-add'> case 'ww':</span>&nbsp; <span class='diff-add'> case 'W':</span>&nbsp; <span class='diff-add'> case 'WW':</span>&nbsp; <span class='diff-add'> case 'd':</span>&nbsp; <span class='diff-add'> case 'e':</span>&nbsp; <span class='diff-add'> case 'E':</span>&nbsp; <span class='diff-add'> token = token.substr(0, 1);</span>&nbsp; <span class='diff-add'> /* falls through */</span>&nbsp; <span class='diff-add'> case 'gggg':</span>&nbsp; <span class='diff-add'> case 'GGGG':</span>&nbsp; <span class='diff-add'> case 'GGGGG':</span>&nbsp; <span class='diff-add'> token = token.substr(0, 2);</span>&nbsp; <span class='diff-add'> if (input) {</span>&nbsp; <span class='diff-add'> config._w = config._w || {};</span>&nbsp; <span class='diff-add'> config._w[token] = toInt(input);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'gg':</span>&nbsp; <span class='diff-add'> case 'GG':</span>&nbsp; <span class='diff-add'> config._w = config._w || {};</span>&nbsp; <span class='diff-add'> config._w[token] = moment.parseTwoDigitYear(input);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function dayOfYearFromWeekInfo(config) {</span>&nbsp; <span class='diff-add'> var w, weekYear, week, weekday, dow, doy, temp;</span>&nbsp; <span class='diff-add'> w = config._w;</span>&nbsp; <span class='diff-add'> if (w.GG != null || w.W != null || w.E != null) {</span>&nbsp; <span class='diff-add'> dow = 1;</span>&nbsp; <span class='diff-add'> doy = 4;</span>&nbsp; <span class='diff-add'> // TODO: We need to take the current isoWeekYear, but that depends on</span>&nbsp; <span class='diff-add'> // how we interpret now (local, utc, fixed offset). So create</span>&nbsp; <span class='diff-add'> // a now version of current config (take local/utc/offset flags, and</span>&nbsp; <span class='diff-add'> // create now).</span>&nbsp; <span class='diff-add'> weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year);</span>&nbsp; <span class='diff-add'> week = dfl(w.W, 1);</span>&nbsp; <span class='diff-add'> weekday = dfl(w.E, 1);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> dow = config._locale._week.dow;</span>&nbsp; <span class='diff-add'> doy = config._locale._week.doy;</span>&nbsp; <span class='diff-add'> weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year);</span>&nbsp; <span class='diff-add'> week = dfl(w.w, 1);</span>&nbsp; <span class='diff-add'> if (w.d != null) {</span>&nbsp; <span class='diff-add'> // weekday -- low day numbers are considered next week</span>&nbsp; <span class='diff-add'> weekday = w.d;</span>&nbsp; <span class='diff-add'> if (weekday < dow) {</span>&nbsp; <span class='diff-add'> ++week;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (w.e != null) {</span>&nbsp; <span class='diff-add'> // local weekday -- counting starts from begining of week</span>&nbsp; <span class='diff-add'> weekday = w.e + dow;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // default to begining of week</span>&nbsp; <span class='diff-add'> weekday = dow;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);</span>&nbsp; <span class='diff-add'> config._a[YEAR] = temp.year;</span>&nbsp; <span class='diff-add'> config._dayOfYear = temp.dayOfYear;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // convert an array to a date.</span>&nbsp; <span class='diff-add'> // the array should mirror the parameters below</span>&nbsp; <span class='diff-add'> // note: all values past the year are optional and will default to the lowest possible value.</span>&nbsp; <span class='diff-add'> // [year, month, day , hour, minute, second, millisecond]</span>&nbsp; <span class='diff-add'> function dateFromConfig(config) {</span>&nbsp; <span class='diff-add'> var i, date, input = [], currentDate, yearToUse;</span>&nbsp; <span class='diff-add'> if (config._d) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> currentDate = currentDateArray(config);</span>&nbsp; <span class='diff-add'> //compute day of the year from weeks and weekdays</span>&nbsp; <span class='diff-add'> if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {</span>&nbsp; <span class='diff-add'> dayOfYearFromWeekInfo(config);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //if the day of the year is set, figure out what it is</span>&nbsp; <span class='diff-add'> if (config._dayOfYear) {</span>&nbsp; <span class='diff-add'> yearToUse = dfl(config._a[YEAR], currentDate[YEAR]);</span>&nbsp; <span class='diff-add'> if (config._dayOfYear > daysInYear(yearToUse)) {</span>&nbsp; <span class='diff-add'> config._pf._overflowDayOfYear = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> date = makeUTCDate(yearToUse, 0, config._dayOfYear);</span>&nbsp; <span class='diff-add'> config._a[MONTH] = date.getUTCMonth();</span>&nbsp; <span class='diff-add'> config._a[DATE] = date.getUTCDate();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Default to current date.</span>&nbsp; <span class='diff-add'> // * if no year, month, day of month are given, default to today</span>&nbsp; <span class='diff-add'> // * if day of month is given, default month and year</span>&nbsp; <span class='diff-add'> // * if month is given, default only year</span>&nbsp; <span class='diff-add'> // * if year is given, don't default anything</span>&nbsp; <span class='diff-add'> for (i = 0; i < 3 && config._a[i] == null; ++i) {</span>&nbsp; <span class='diff-add'> config._a[i] = input[i] = currentDate[i];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Zero out whatever was not defaulted, including time</span>&nbsp; <span class='diff-add'> for (; i < 7; i++) {</span>&nbsp; <span class='diff-add'> config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Check for 24:00:00.000</span>&nbsp; <span class='diff-add'> if (config._a[HOUR] === 24 &&</span>&nbsp; <span class='diff-add'> config._a[MINUTE] === 0 &&</span>&nbsp; <span class='diff-add'> config._a[SECOND] === 0 &&</span>&nbsp; <span class='diff-add'> config._a[MILLISECOND] === 0) {</span>&nbsp; <span class='diff-add'> config._nextDay = true;</span>&nbsp; <span class='diff-add'> config._a[HOUR] = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);</span>&nbsp; <span class='diff-add'> // Apply timezone offset from input. The actual zone can be changed</span>&nbsp; <span class='diff-add'> // with parseZone.</span>&nbsp; <span class='diff-add'> if (config._tzm != null) {</span>&nbsp; <span class='diff-add'> config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (config._nextDay) {</span>&nbsp; <span class='diff-add'> config._a[HOUR] = 24;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function dateFromObject(config) {</span>&nbsp; <span class='diff-add'> var normalizedInput;</span>&nbsp; <span class='diff-add'> if (config._d) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> normalizedInput = normalizeObjectUnits(config._i);</span>&nbsp; <span class='diff-add'> config._a = [</span>&nbsp; <span class='diff-add'> normalizedInput.year,</span>&nbsp; <span class='diff-add'> normalizedInput.month,</span>&nbsp; <span class='diff-add'> normalizedInput.day || normalizedInput.date,</span>&nbsp; <span class='diff-add'> normalizedInput.hour,</span>&nbsp; <span class='diff-add'> normalizedInput.minute,</span>&nbsp; <span class='diff-add'> normalizedInput.second,</span>&nbsp; <span class='diff-add'> normalizedInput.millisecond</span>&nbsp; <span class='diff-add'> ];</span>&nbsp; <span class='diff-add'> dateFromConfig(config);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function currentDateArray(config) {</span>&nbsp; <span class='diff-add'> var now = new Date();</span>&nbsp; <span class='diff-add'> if (config._useUTC) {</span>&nbsp; <span class='diff-add'> return [</span>&nbsp; <span class='diff-add'> now.getUTCFullYear(),</span>&nbsp; <span class='diff-add'> now.getUTCMonth(),</span>&nbsp; <span class='diff-add'> now.getUTCDate()</span>&nbsp; <span class='diff-add'> ];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return [now.getFullYear(), now.getMonth(), now.getDate()];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // date from string and format string</span>&nbsp; <span class='diff-add'> function makeDateFromStringAndFormat(config) {</span>&nbsp; <span class='diff-add'> if (config._f === moment.ISO_8601) {</span>&nbsp; <span class='diff-add'> parseISO(config);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> config._a = [];</span>&nbsp; <span class='diff-add'> config._pf.empty = true;</span>&nbsp; <span class='diff-add'> // This array is used to make a Date, either with `new Date` or `Date.UTC`</span>&nbsp; <span class='diff-add'> var string = '' + config._i,</span>&nbsp; <span class='diff-add'> i, parsedInput, tokens, token, skipped,</span>&nbsp; <span class='diff-add'> stringLength = string.length,</span>&nbsp; <span class='diff-add'> totalParsedInputLength = 0;</span>&nbsp; <span class='diff-add'> tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];</span>&nbsp; <span class='diff-add'> for (i = 0; i < tokens.length; i++) {</span>&nbsp; <span class='diff-add'> token = tokens[i];</span>&nbsp; <span class='diff-add'> parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];</span>&nbsp; <span class='diff-add'> if (parsedInput) {</span>&nbsp; <span class='diff-add'> skipped = string.substr(0, string.indexOf(parsedInput));</span>&nbsp; <span class='diff-add'> if (skipped.length > 0) {</span>&nbsp; <span class='diff-add'> config._pf.unusedInput.push(skipped);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> string = string.slice(string.indexOf(parsedInput) + parsedInput.length);</span>&nbsp; <span class='diff-add'> totalParsedInputLength += parsedInput.length;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // don't parse if it's not a known token</span>&nbsp; <span class='diff-add'> if (formatTokenFunctions[token]) {</span>&nbsp; <span class='diff-add'> if (parsedInput) {</span>&nbsp; <span class='diff-add'> config._pf.empty = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> config._pf.unusedTokens.push(token);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> addTimeToArrayFromToken(token, parsedInput, config);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else if (config._strict && !parsedInput) {</span>&nbsp; <span class='diff-add'> config._pf.unusedTokens.push(token);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // add remaining unparsed input length to the string</span>&nbsp; <span class='diff-add'> config._pf.charsLeftOver = stringLength - totalParsedInputLength;</span>&nbsp; <span class='diff-add'> if (string.length > 0) {</span>&nbsp; <span class='diff-add'> config._pf.unusedInput.push(string);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // clear _12h flag if hour is <= 12</span>&nbsp; <span class='diff-add'> if (config._pf.bigHour === true && config._a[HOUR] <= 12) {</span>&nbsp; <span class='diff-add'> config._pf.bigHour = undefined;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // handle am pm</span>&nbsp; <span class='diff-add'> if (config._isPm && config._a[HOUR] < 12) {</span>&nbsp; <span class='diff-add'> config._a[HOUR] += 12;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // if is 12 am, change hours to 0</span>&nbsp; <span class='diff-add'> if (config._isPm === false && config._a[HOUR] === 12) {</span>&nbsp; <span class='diff-add'> config._a[HOUR] = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> dateFromConfig(config);</span>&nbsp; <span class='diff-add'> checkOverflow(config);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function unescapeFormat(s) {</span>&nbsp; <span class='diff-add'> return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {</span>&nbsp; <span class='diff-add'> return p1 || p2 || p3 || p4;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript</span>&nbsp; <span class='diff-add'> function regexpEscape(s) {</span>&nbsp; <span class='diff-add'> return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // date from string and array of format strings</span>&nbsp; <span class='diff-add'> function makeDateFromStringAndArray(config) {</span>&nbsp; <span class='diff-add'> var tempConfig,</span>&nbsp; <span class='diff-add'> bestMoment,</span>&nbsp; <span class='diff-add'> scoreToBeat,</span>&nbsp; <span class='diff-add'> i,</span>&nbsp; <span class='diff-add'> currentScore;</span>&nbsp; <span class='diff-add'> if (config._f.length === 0) {</span>&nbsp; <span class='diff-add'> config._pf.invalidFormat = true;</span>&nbsp; <span class='diff-add'> config._d = new Date(NaN);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (i = 0; i < config._f.length; i++) {</span>&nbsp; <span class='diff-add'> currentScore = 0;</span>&nbsp; <span class='diff-add'> tempConfig = copyConfig({}, config);</span>&nbsp; <span class='diff-add'> if (config._useUTC != null) {</span>&nbsp; <span class='diff-add'> tempConfig._useUTC = config._useUTC;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> tempConfig._pf = defaultParsingFlags();</span>&nbsp; <span class='diff-add'> tempConfig._f = config._f[i];</span>&nbsp; <span class='diff-add'> makeDateFromStringAndFormat(tempConfig);</span>&nbsp; <span class='diff-add'> if (!isValid(tempConfig)) {</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // if there is any input that was not parsed add a penalty for that format</span>&nbsp; <span class='diff-add'> currentScore += tempConfig._pf.charsLeftOver;</span>&nbsp; <span class='diff-add'> //or tokens</span>&nbsp; <span class='diff-add'> currentScore += tempConfig._pf.unusedTokens.length * 10;</span>&nbsp; <span class='diff-add'> tempConfig._pf.score = currentScore;</span>&nbsp; <span class='diff-add'> if (scoreToBeat == null || currentScore < scoreToBeat) {</span>&nbsp; <span class='diff-add'> scoreToBeat = currentScore;</span>&nbsp; <span class='diff-add'> bestMoment = tempConfig;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> extend(config, bestMoment || tempConfig);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // date from iso format</span>&nbsp; <span class='diff-add'> function parseISO(config) {</span>&nbsp; <span class='diff-add'> var i, l,</span>&nbsp; <span class='diff-add'> string = config._i,</span>&nbsp; <span class='diff-add'> match = isoRegex.exec(string);</span>&nbsp; <span class='diff-add'> if (match) {</span>&nbsp; <span class='diff-add'> config._pf.iso = true;</span>&nbsp; <span class='diff-add'> for (i = 0, l = isoDates.length; i < l; i++) {</span>&nbsp; <span class='diff-add'> if (isoDates[i][1].exec(string)) {</span>&nbsp; <span class='diff-add'> // match[5] should be 'T' or undefined</span>&nbsp; <span class='diff-add'> config._f = isoDates[i][0] + (match[6] || ' ');</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (i = 0, l = isoTimes.length; i < l; i++) {</span>&nbsp; <span class='diff-add'> if (isoTimes[i][1].exec(string)) {</span>&nbsp; <span class='diff-add'> config._f += isoTimes[i][0];</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (string.match(parseTokenTimezone)) {</span>&nbsp; <span class='diff-add'> config._f += 'Z';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> makeDateFromStringAndFormat(config);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> config._isValid = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // date from iso format or fallback</span>&nbsp; <span class='diff-add'> function makeDateFromString(config) {</span>&nbsp; <span class='diff-add'> parseISO(config);</span>&nbsp; <span class='diff-add'> if (config._isValid === false) {</span>&nbsp; <span class='diff-add'> delete config._isValid;</span>&nbsp; <span class='diff-add'> moment.createFromInputFallback(config);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function map(arr, fn) {</span>&nbsp; <span class='diff-add'> var res = [], i;</span>&nbsp; <span class='diff-add'> for (i = 0; i < arr.length; ++i) {</span>&nbsp; <span class='diff-add'> res.push(fn(arr[i], i));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return res;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function makeDateFromInput(config) {</span>&nbsp; <span class='diff-add'> var input = config._i, matched;</span>&nbsp; <span class='diff-add'> if (input === undefined) {</span>&nbsp; <span class='diff-add'> config._d = new Date();</span>&nbsp; <span class='diff-add'> } else if (isDate(input)) {</span>&nbsp; <span class='diff-add'> config._d = new Date(+input);</span>&nbsp; <span class='diff-add'> } else if ((matched = aspNetJsonRegex.exec(input)) !== null) {</span>&nbsp; <span class='diff-add'> config._d = new Date(+matched[1]);</span>&nbsp; <span class='diff-add'> } else if (typeof input === 'string') {</span>&nbsp; <span class='diff-add'> makeDateFromString(config);</span>&nbsp; <span class='diff-add'> } else if (isArray(input)) {</span>&nbsp; <span class='diff-add'> config._a = map(input.slice(0), function (obj) {</span>&nbsp; <span class='diff-add'> return parseInt(obj, 10);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> dateFromConfig(config);</span>&nbsp; <span class='diff-add'> } else if (typeof(input) === 'object') {</span>&nbsp; <span class='diff-add'> dateFromObject(config);</span>&nbsp; <span class='diff-add'> } else if (typeof(input) === 'number') {</span>&nbsp; <span class='diff-add'> // from milliseconds</span>&nbsp; <span class='diff-add'> config._d = new Date(input);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> moment.createFromInputFallback(config);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function makeDate(y, m, d, h, M, s, ms) {</span>&nbsp; <span class='diff-add'> //can't just apply() to create a date:</span>&nbsp; <span class='diff-add'> //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply</span>&nbsp; <span class='diff-add'> var date = new Date(y, m, d, h, M, s, ms);</span>&nbsp; <span class='diff-add'> //the date constructor doesn't accept years < 1970</span>&nbsp; <span class='diff-add'> if (y < 1970) {</span>&nbsp; <span class='diff-add'> date.setFullYear(y);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return date;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function makeUTCDate(y) {</span>&nbsp; <span class='diff-add'> var date = new Date(Date.UTC.apply(null, arguments));</span>&nbsp; <span class='diff-add'> if (y < 1970) {</span>&nbsp; <span class='diff-add'> date.setUTCFullYear(y);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return date;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function parseWeekday(input, locale) {</span>&nbsp; <span class='diff-add'> if (typeof input === 'string') {</span>&nbsp; <span class='diff-add'> if (!isNaN(input)) {</span>&nbsp; <span class='diff-add'> input = parseInt(input, 10);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> input = locale.weekdaysParse(input);</span>&nbsp; <span class='diff-add'> if (typeof input !== 'number') {</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return input;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Relative Time</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize</span>&nbsp; <span class='diff-add'> function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {</span>&nbsp; <span class='diff-add'> return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function relativeTime(posNegDuration, withoutSuffix, locale) {</span>&nbsp; <span class='diff-add'> var duration = moment.duration(posNegDuration).abs(),</span>&nbsp; <span class='diff-add'> seconds = round(duration.as('s')),</span>&nbsp; <span class='diff-add'> minutes = round(duration.as('m')),</span>&nbsp; <span class='diff-add'> hours = round(duration.as('h')),</span>&nbsp; <span class='diff-add'> days = round(duration.as('d')),</span>&nbsp; <span class='diff-add'> months = round(duration.as('M')),</span>&nbsp; <span class='diff-add'> years = round(duration.as('y')),</span>&nbsp; <span class='diff-add'> args = seconds < relativeTimeThresholds.s && ['s', seconds] ||</span>&nbsp; <span class='diff-add'> minutes === 1 && ['m'] ||</span>&nbsp; <span class='diff-add'> minutes < relativeTimeThresholds.m && ['mm', minutes] ||</span>&nbsp; <span class='diff-add'> hours === 1 && ['h'] ||</span>&nbsp; <span class='diff-add'> hours < relativeTimeThresholds.h && ['hh', hours] ||</span>&nbsp; <span class='diff-add'> days === 1 && ['d'] ||</span>&nbsp; <span class='diff-add'> days < relativeTimeThresholds.d && ['dd', days] ||</span>&nbsp; <span class='diff-add'> months === 1 && ['M'] ||</span>&nbsp; <span class='diff-add'> months < relativeTimeThresholds.M && ['MM', months] ||</span>&nbsp; <span class='diff-add'> years === 1 && ['y'] || ['yy', years];</span>&nbsp; <span class='diff-add'> args[2] = withoutSuffix;</span>&nbsp; <span class='diff-add'> args[3] = +posNegDuration > 0;</span>&nbsp; <span class='diff-add'> args[4] = locale;</span>&nbsp; <span class='diff-add'> return substituteTimeAgo.apply({}, args);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Week of Year</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> // firstDayOfWeek 0 = sun, 6 = sat</span>&nbsp; <span class='diff-add'> // the day of the week that starts the week</span>&nbsp; <span class='diff-add'> // (usually sunday or monday)</span>&nbsp; <span class='diff-add'> // firstDayOfWeekOfYear 0 = sun, 6 = sat</span>&nbsp; <span class='diff-add'> // the first week is the week that contains the first</span>&nbsp; <span class='diff-add'> // of this day of the week</span>&nbsp; <span class='diff-add'> // (eg. ISO weeks use thursday (4))</span>&nbsp; <span class='diff-add'> function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {</span>&nbsp; <span class='diff-add'> var end = firstDayOfWeekOfYear - firstDayOfWeek,</span>&nbsp; <span class='diff-add'> daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),</span>&nbsp; <span class='diff-add'> adjustedMoment;</span>&nbsp; <span class='diff-add'> if (daysToDayOfWeek > end) {</span>&nbsp; <span class='diff-add'> daysToDayOfWeek -= 7;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (daysToDayOfWeek < end - 7) {</span>&nbsp; <span class='diff-add'> daysToDayOfWeek += 7;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd');</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> week: Math.ceil(adjustedMoment.dayOfYear() / 7),</span>&nbsp; <span class='diff-add'> year: adjustedMoment.year()</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday</span>&nbsp; <span class='diff-add'> function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {</span>&nbsp; <span class='diff-add'> var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear;</span>&nbsp; <span class='diff-add'> d = d === 0 ? 7 : d;</span>&nbsp; <span class='diff-add'> weekday = weekday != null ? weekday : firstDayOfWeek;</span>&nbsp; <span class='diff-add'> daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);</span>&nbsp; <span class='diff-add'> dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> year: dayOfYear > 0 ? year : year - 1,</span>&nbsp; <span class='diff-add'> dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Top Level Functions</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> function makeMoment(config) {</span>&nbsp; <span class='diff-add'> var input = config._i,</span>&nbsp; <span class='diff-add'> format = config._f,</span>&nbsp; <span class='diff-add'> res;</span>&nbsp; <span class='diff-add'> config._locale = config._locale || moment.localeData(config._l);</span>&nbsp; <span class='diff-add'> if (input === null || (format === undefined && input === '')) {</span>&nbsp; <span class='diff-add'> return moment.invalid({nullInput: true});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof input === 'string') {</span>&nbsp; <span class='diff-add'> config._i = input = config._locale.preparse(input);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (moment.isMoment(input)) {</span>&nbsp; <span class='diff-add'> return new Moment(input, true);</span>&nbsp; <span class='diff-add'> } else if (format) {</span>&nbsp; <span class='diff-add'> if (isArray(format)) {</span>&nbsp; <span class='diff-add'> makeDateFromStringAndArray(config);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> makeDateFromStringAndFormat(config);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> makeDateFromInput(config);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> res = new Moment(config);</span>&nbsp; <span class='diff-add'> if (res._nextDay) {</span>&nbsp; <span class='diff-add'> // Adding is smart enough around DST</span>&nbsp; <span class='diff-add'> res.add(1, 'd');</span>&nbsp; <span class='diff-add'> res._nextDay = undefined;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return res;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> moment = function (input, format, locale, strict) {</span>&nbsp; <span class='diff-add'> var c;</span>&nbsp; <span class='diff-add'> if (typeof(locale) === 'boolean') {</span>&nbsp; <span class='diff-add'> strict = locale;</span>&nbsp; <span class='diff-add'> locale = undefined;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // object construction must be done this way.</span>&nbsp; <span class='diff-add'> // https://github.com/moment/moment/issues/1423</span>&nbsp; <span class='diff-add'> c = {};</span>&nbsp; <span class='diff-add'> c._isAMomentObject = true;</span>&nbsp; <span class='diff-add'> c._i = input;</span>&nbsp; <span class='diff-add'> c._f = format;</span>&nbsp; <span class='diff-add'> c._l = locale;</span>&nbsp; <span class='diff-add'> c._strict = strict;</span>&nbsp; <span class='diff-add'> c._isUTC = false;</span>&nbsp; <span class='diff-add'> c._pf = defaultParsingFlags();</span>&nbsp; <span class='diff-add'> return makeMoment(c);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.suppressDeprecationWarnings = false;</span>&nbsp; <span class='diff-add'> moment.createFromInputFallback = deprecate(</span>&nbsp; <span class='diff-add'> 'moment construction falls back to js Date. This is ' +</span>&nbsp; <span class='diff-add'> 'discouraged and will be removed in upcoming major ' +</span>&nbsp; <span class='diff-add'> 'release. Please refer to ' +</span>&nbsp; <span class='diff-add'> 'https://github.com/moment/moment/issues/1407 for more info.',</span>&nbsp; <span class='diff-add'> function (config) {</span>&nbsp; <span class='diff-add'> config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> // Pick a moment m from moments so that m[fn](other) is true for all</span>&nbsp; <span class='diff-add'> // other. This relies on the function fn to be transitive.</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // moments should either be an array of moment objects or an array, whose</span>&nbsp; <span class='diff-add'> // first element is an array of moment objects.</span>&nbsp; <span class='diff-add'> function pickBy(fn, moments) {</span>&nbsp; <span class='diff-add'> var res, i;</span>&nbsp; <span class='diff-add'> if (moments.length === 1 && isArray(moments[0])) {</span>&nbsp; <span class='diff-add'> moments = moments[0];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!moments.length) {</span>&nbsp; <span class='diff-add'> return moment();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> res = moments[0];</span>&nbsp; <span class='diff-add'> for (i = 1; i < moments.length; ++i) {</span>&nbsp; <span class='diff-add'> if (moments[i][fn](res)) {</span>&nbsp; <span class='diff-add'> res = moments[i];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return res;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> moment.min = function () {</span>&nbsp; <span class='diff-add'> var args = [].slice.call(arguments, 0);</span>&nbsp; <span class='diff-add'> return pickBy('isBefore', args);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.max = function () {</span>&nbsp; <span class='diff-add'> var args = [].slice.call(arguments, 0);</span>&nbsp; <span class='diff-add'> return pickBy('isAfter', args);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // creating with utc</span>&nbsp; <span class='diff-add'> moment.utc = function (input, format, locale, strict) {</span>&nbsp; <span class='diff-add'> var c;</span>&nbsp; <span class='diff-add'> if (typeof(locale) === 'boolean') {</span>&nbsp; <span class='diff-add'> strict = locale;</span>&nbsp; <span class='diff-add'> locale = undefined;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // object construction must be done this way.</span>&nbsp; <span class='diff-add'> // https://github.com/moment/moment/issues/1423</span>&nbsp; <span class='diff-add'> c = {};</span>&nbsp; <span class='diff-add'> c._isAMomentObject = true;</span>&nbsp; <span class='diff-add'> c._useUTC = true;</span>&nbsp; <span class='diff-add'> c._isUTC = true;</span>&nbsp; <span class='diff-add'> c._l = locale;</span>&nbsp; <span class='diff-add'> c._i = input;</span>&nbsp; <span class='diff-add'> c._f = format;</span>&nbsp; <span class='diff-add'> c._strict = strict;</span>&nbsp; <span class='diff-add'> c._pf = defaultParsingFlags();</span>&nbsp; <span class='diff-add'> return makeMoment(c).utc();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // creating with unix timestamp (in seconds)</span>&nbsp; <span class='diff-add'> moment.unix = function (input) {</span>&nbsp; <span class='diff-add'> return moment(input * 1000);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // duration</span>&nbsp; <span class='diff-add'> moment.duration = function (input, key) {</span>&nbsp; <span class='diff-add'> var duration = input,</span>&nbsp; <span class='diff-add'> // matching against regexp is expensive, do it on demand</span>&nbsp; <span class='diff-add'> match = null,</span>&nbsp; <span class='diff-add'> sign,</span>&nbsp; <span class='diff-add'> ret,</span>&nbsp; <span class='diff-add'> parseIso,</span>&nbsp; <span class='diff-add'> diffRes;</span>&nbsp; <span class='diff-add'> if (moment.isDuration(input)) {</span>&nbsp; <span class='diff-add'> duration = {</span>&nbsp; <span class='diff-add'> ms: input._milliseconds,</span>&nbsp; <span class='diff-add'> d: input._days,</span>&nbsp; <span class='diff-add'> M: input._months</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> } else if (typeof input === 'number') {</span>&nbsp; <span class='diff-add'> duration = {};</span>&nbsp; <span class='diff-add'> if (key) {</span>&nbsp; <span class='diff-add'> duration[key] = input;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> duration.milliseconds = input;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {</span>&nbsp; <span class='diff-add'> sign = (match[1] === '-') ? -1 : 1;</span>&nbsp; <span class='diff-add'> duration = {</span>&nbsp; <span class='diff-add'> y: 0,</span>&nbsp; <span class='diff-add'> d: toInt(match[DATE]) * sign,</span>&nbsp; <span class='diff-add'> h: toInt(match[HOUR]) * sign,</span>&nbsp; <span class='diff-add'> m: toInt(match[MINUTE]) * sign,</span>&nbsp; <span class='diff-add'> s: toInt(match[SECOND]) * sign,</span>&nbsp; <span class='diff-add'> ms: toInt(match[MILLISECOND]) * sign</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> } else if (!!(match = isoDurationRegex.exec(input))) {</span>&nbsp; <span class='diff-add'> sign = (match[1] === '-') ? -1 : 1;</span>&nbsp; <span class='diff-add'> parseIso = function (inp) {</span>&nbsp; <span class='diff-add'> // We'd normally use ~~inp for this, but unfortunately it also</span>&nbsp; <span class='diff-add'> // converts floats to ints.</span>&nbsp; <span class='diff-add'> // inp may be undefined, so careful calling replace on it.</span>&nbsp; <span class='diff-add'> var res = inp && parseFloat(inp.replace(',', '.'));</span>&nbsp; <span class='diff-add'> // apply sign while we're at it</span>&nbsp; <span class='diff-add'> return (isNaN(res) ? 0 : res) * sign;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> duration = {</span>&nbsp; <span class='diff-add'> y: parseIso(match[2]),</span>&nbsp; <span class='diff-add'> M: parseIso(match[3]),</span>&nbsp; <span class='diff-add'> d: parseIso(match[4]),</span>&nbsp; <span class='diff-add'> h: parseIso(match[5]),</span>&nbsp; <span class='diff-add'> m: parseIso(match[6]),</span>&nbsp; <span class='diff-add'> s: parseIso(match[7]),</span>&nbsp; <span class='diff-add'> w: parseIso(match[8])</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> } else if (typeof duration === 'object' &&</span>&nbsp; <span class='diff-add'> ('from' in duration || 'to' in duration)) {</span>&nbsp; <span class='diff-add'> diffRes = momentsDifference(moment(duration.from), moment(duration.to));</span>&nbsp; <span class='diff-add'> duration = {};</span>&nbsp; <span class='diff-add'> duration.ms = diffRes.milliseconds;</span>&nbsp; <span class='diff-add'> duration.M = diffRes.months;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ret = new Duration(duration);</span>&nbsp; <span class='diff-add'> if (moment.isDuration(input) && hasOwnProp(input, '_locale')) {</span>&nbsp; <span class='diff-add'> ret._locale = input._locale;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return ret;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // version number</span>&nbsp; <span class='diff-add'> moment.version = VERSION;</span>&nbsp; <span class='diff-add'> // default format</span>&nbsp; <span class='diff-add'> moment.defaultFormat = isoFormat;</span>&nbsp; <span class='diff-add'> // constant that refers to the ISO standard</span>&nbsp; <span class='diff-add'> moment.ISO_8601 = function () {};</span>&nbsp; <span class='diff-add'> // Plugins that add properties should also add the key here (null value),</span>&nbsp; <span class='diff-add'> // so we can properly clone ourselves.</span>&nbsp; <span class='diff-add'> moment.momentProperties = momentProperties;</span>&nbsp; <span class='diff-add'> // This function will be called whenever a moment is mutated.</span>&nbsp; <span class='diff-add'> // It is intended to keep the offset in sync with the timezone.</span>&nbsp; <span class='diff-add'> moment.updateOffset = function () {};</span>&nbsp; <span class='diff-add'> // This function allows you to set a threshold for relative time strings</span>&nbsp; <span class='diff-add'> moment.relativeTimeThreshold = function (threshold, limit) {</span>&nbsp; <span class='diff-add'> if (relativeTimeThresholds[threshold] === undefined) {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (limit === undefined) {</span>&nbsp; <span class='diff-add'> return relativeTimeThresholds[threshold];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> relativeTimeThresholds[threshold] = limit;</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.lang = deprecate(</span>&nbsp; <span class='diff-add'> 'moment.lang is deprecated. Use moment.locale instead.',</span>&nbsp; <span class='diff-add'> function (key, value) {</span>&nbsp; <span class='diff-add'> return moment.locale(key, value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> // This function will load locale and then set the global locale. If</span>&nbsp; <span class='diff-add'> // no arguments are passed in, it will simply return the current global</span>&nbsp; <span class='diff-add'> // locale key.</span>&nbsp; <span class='diff-add'> moment.locale = function (key, values) {</span>&nbsp; <span class='diff-add'> var data;</span>&nbsp; <span class='diff-add'> if (key) {</span>&nbsp; <span class='diff-add'> if (typeof(values) !== 'undefined') {</span>&nbsp; <span class='diff-add'> data = moment.defineLocale(key, values);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> data = moment.localeData(key);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (data) {</span>&nbsp; <span class='diff-add'> moment.duration._locale = moment._locale = data;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return moment._locale._abbr;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.defineLocale = function (name, values) {</span>&nbsp; <span class='diff-add'> if (values !== null) {</span>&nbsp; <span class='diff-add'> values.abbr = name;</span>&nbsp; <span class='diff-add'> if (!locales[name]) {</span>&nbsp; <span class='diff-add'> locales[name] = new Locale();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> locales[name].set(values);</span>&nbsp; <span class='diff-add'> // backwards compat for now: also set the locale</span>&nbsp; <span class='diff-add'> moment.locale(name);</span>&nbsp; <span class='diff-add'> return locales[name];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // useful for testing</span>&nbsp; <span class='diff-add'> delete locales[name];</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.langData = deprecate(</span>&nbsp; <span class='diff-add'> 'moment.langData is deprecated. Use moment.localeData instead.',</span>&nbsp; <span class='diff-add'> function (key) {</span>&nbsp; <span class='diff-add'> return moment.localeData(key);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> // returns locale data</span>&nbsp; <span class='diff-add'> moment.localeData = function (key) {</span>&nbsp; <span class='diff-add'> var locale;</span>&nbsp; <span class='diff-add'> if (key && key._locale && key._locale._abbr) {</span>&nbsp; <span class='diff-add'> key = key._locale._abbr;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!key) {</span>&nbsp; <span class='diff-add'> return moment._locale;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!isArray(key)) {</span>&nbsp; <span class='diff-add'> //short-circuit everything else</span>&nbsp; <span class='diff-add'> locale = loadLocale(key);</span>&nbsp; <span class='diff-add'> if (locale) {</span>&nbsp; <span class='diff-add'> return locale;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> key = [key];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return chooseLocale(key);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // compare moment object</span>&nbsp; <span class='diff-add'> moment.isMoment = function (obj) {</span>&nbsp; <span class='diff-add'> return obj instanceof Moment ||</span>&nbsp; <span class='diff-add'> (obj != null && hasOwnProp(obj, '_isAMomentObject'));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // for typechecking Duration objects</span>&nbsp; <span class='diff-add'> moment.isDuration = function (obj) {</span>&nbsp; <span class='diff-add'> return obj instanceof Duration;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> for (i = lists.length - 1; i >= 0; --i) {</span>&nbsp; <span class='diff-add'> makeList(lists[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> moment.normalizeUnits = function (units) {</span>&nbsp; <span class='diff-add'> return normalizeUnits(units);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.invalid = function (flags) {</span>&nbsp; <span class='diff-add'> var m = moment.utc(NaN);</span>&nbsp; <span class='diff-add'> if (flags != null) {</span>&nbsp; <span class='diff-add'> extend(m._pf, flags);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> m._pf.userInvalidated = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return m;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.parseZone = function () {</span>&nbsp; <span class='diff-add'> return moment.apply(null, arguments).parseZone();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.parseTwoDigitYear = function (input) {</span>&nbsp; <span class='diff-add'> return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Moment Prototype</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> extend(moment.fn = Moment.prototype, {</span>&nbsp; <span class='diff-add'> clone : function () {</span>&nbsp; <span class='diff-add'> return moment(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> valueOf : function () {</span>&nbsp; <span class='diff-add'> return +this._d + ((this._offset || 0) * 60000);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> unix : function () {</span>&nbsp; <span class='diff-add'> return Math.floor(+this / 1000);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> toString : function () {</span>&nbsp; <span class='diff-add'> return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> toDate : function () {</span>&nbsp; <span class='diff-add'> return this._offset ? new Date(+this) : this._d;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> toISOString : function () {</span>&nbsp; <span class='diff-add'> var m = moment(this).utc();</span>&nbsp; <span class='diff-add'> if (0 < m.year() && m.year() <= 9999) {</span>&nbsp; <span class='diff-add'> if ('function' === typeof Date.prototype.toISOString) {</span>&nbsp; <span class='diff-add'> // native implementation is ~50x faster, use it when we can</span>&nbsp; <span class='diff-add'> return this.toDate().toISOString();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> toArray : function () {</span>&nbsp; <span class='diff-add'> var m = this;</span>&nbsp; <span class='diff-add'> return [</span>&nbsp; <span class='diff-add'> m.year(),</span>&nbsp; <span class='diff-add'> m.month(),</span>&nbsp; <span class='diff-add'> m.date(),</span>&nbsp; <span class='diff-add'> m.hours(),</span>&nbsp; <span class='diff-add'> m.minutes(),</span>&nbsp; <span class='diff-add'> m.seconds(),</span>&nbsp; <span class='diff-add'> m.milliseconds()</span>&nbsp; <span class='diff-add'> ];</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isValid : function () {</span>&nbsp; <span class='diff-add'> return isValid(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isDSTShifted : function () {</span>&nbsp; <span class='diff-add'> if (this._a) {</span>&nbsp; <span class='diff-add'> return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> parsingFlags : function () {</span>&nbsp; <span class='diff-add'> return extend({}, this._pf);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> invalidAt: function () {</span>&nbsp; <span class='diff-add'> return this._pf.overflow;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> utc : function (keepLocalTime) {</span>&nbsp; <span class='diff-add'> return this.zone(0, keepLocalTime);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> local : function (keepLocalTime) {</span>&nbsp; <span class='diff-add'> if (this._isUTC) {</span>&nbsp; <span class='diff-add'> this.zone(0, keepLocalTime);</span>&nbsp; <span class='diff-add'> this._isUTC = false;</span>&nbsp; <span class='diff-add'> if (keepLocalTime) {</span>&nbsp; <span class='diff-add'> this.add(this._dateTzOffset(), 'm');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> format : function (inputString) {</span>&nbsp; <span class='diff-add'> var output = formatMoment(this, inputString || moment.defaultFormat);</span>&nbsp; <span class='diff-add'> return this.localeData().postformat(output);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> add : createAdder(1, 'add'),</span>&nbsp; <span class='diff-add'> subtract : createAdder(-1, 'subtract'),</span>&nbsp; <span class='diff-add'> diff : function (input, units, asFloat) {</span>&nbsp; <span class='diff-add'> var that = makeAs(input, this),</span>&nbsp; <span class='diff-add'> zoneDiff = (this.zone() - that.zone()) * 6e4,</span>&nbsp; <span class='diff-add'> diff, output, daysAdjust;</span>&nbsp; <span class='diff-add'> units = normalizeUnits(units);</span>&nbsp; <span class='diff-add'> if (units === 'year' || units === 'month') {</span>&nbsp; <span class='diff-add'> // average number of days in the months in the given dates</span>&nbsp; <span class='diff-add'> diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2</span>&nbsp; <span class='diff-add'> // difference in months</span>&nbsp; <span class='diff-add'> output = ((this.year() - that.year()) * 12) + (this.month() - that.month());</span>&nbsp; <span class='diff-add'> // adjust by taking difference in days, average number of days</span>&nbsp; <span class='diff-add'> // and dst in the given months.</span>&nbsp; <span class='diff-add'> daysAdjust = (this - moment(this).startOf('month')) -</span>&nbsp; <span class='diff-add'> (that - moment(that).startOf('month'));</span>&nbsp; <span class='diff-add'> // same as above but with zones, to negate all dst</span>&nbsp; <span class='diff-add'> daysAdjust -= ((this.zone() - moment(this).startOf('month').zone()) -</span>&nbsp; <span class='diff-add'> (that.zone() - moment(that).startOf('month').zone())) * 6e4;</span>&nbsp; <span class='diff-add'> output += daysAdjust / diff;</span>&nbsp; <span class='diff-add'> if (units === 'year') {</span>&nbsp; <span class='diff-add'> output = output / 12;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> diff = (this - that);</span>&nbsp; <span class='diff-add'> output = units === 'second' ? diff / 1e3 : // 1000</span>&nbsp; <span class='diff-add'> units === 'minute' ? diff / 6e4 : // 1000 * 60</span>&nbsp; <span class='diff-add'> units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60</span>&nbsp; <span class='diff-add'> units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst</span>&nbsp; <span class='diff-add'> units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst</span>&nbsp; <span class='diff-add'> diff;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return asFloat ? output : absRound(output);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> from : function (time, withoutSuffix) {</span>&nbsp; <span class='diff-add'> return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> fromNow : function (withoutSuffix) {</span>&nbsp; <span class='diff-add'> return this.from(moment(), withoutSuffix);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> calendar : function (time) {</span>&nbsp; <span class='diff-add'> // We want to compare the start of today, vs this.</span>&nbsp; <span class='diff-add'> // Getting start-of-today depends on whether we're zone'd or not.</span>&nbsp; <span class='diff-add'> var now = time || moment(),</span>&nbsp; <span class='diff-add'> sod = makeAs(now, this).startOf('day'),</span>&nbsp; <span class='diff-add'> diff = this.diff(sod, 'days', true),</span>&nbsp; <span class='diff-add'> format = diff < -6 ? 'sameElse' :</span>&nbsp; <span class='diff-add'> diff < -1 ? 'lastWeek' :</span>&nbsp; <span class='diff-add'> diff < 0 ? 'lastDay' :</span>&nbsp; <span class='diff-add'> diff < 1 ? 'sameDay' :</span>&nbsp; <span class='diff-add'> diff < 2 ? 'nextDay' :</span>&nbsp; <span class='diff-add'> diff < 7 ? 'nextWeek' : 'sameElse';</span>&nbsp; <span class='diff-add'> return this.format(this.localeData().calendar(format, this, moment(now)));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isLeapYear : function () {</span>&nbsp; <span class='diff-add'> return isLeapYear(this.year());</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isDST : function () {</span>&nbsp; <span class='diff-add'> return (this.zone() < this.clone().month(0).zone() ||</span>&nbsp; <span class='diff-add'> this.zone() < this.clone().month(5).zone());</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> day : function (input) {</span>&nbsp; <span class='diff-add'> var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();</span>&nbsp; <span class='diff-add'> if (input != null) {</span>&nbsp; <span class='diff-add'> input = parseWeekday(input, this.localeData());</span>&nbsp; <span class='diff-add'> return this.add(input - day, 'd');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return day;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> month : makeAccessor('Month', true),</span>&nbsp; <span class='diff-add'> startOf : function (units) {</span>&nbsp; <span class='diff-add'> units = normalizeUnits(units);</span>&nbsp; <span class='diff-add'> // the following switch intentionally omits break keywords</span>&nbsp; <span class='diff-add'> // to utilize falling through the cases.</span>&nbsp; <span class='diff-add'> switch (units) {</span>&nbsp; <span class='diff-add'> case 'year':</span>&nbsp; <span class='diff-add'> this.month(0);</span>&nbsp; <span class='diff-add'> /* falls through */</span>&nbsp; <span class='diff-add'> case 'quarter':</span>&nbsp; <span class='diff-add'> case 'month':</span>&nbsp; <span class='diff-add'> this.date(1);</span>&nbsp; <span class='diff-add'> /* falls through */</span>&nbsp; <span class='diff-add'> case 'week':</span>&nbsp; <span class='diff-add'> case 'isoWeek':</span>&nbsp; <span class='diff-add'> case 'day':</span>&nbsp; <span class='diff-add'> this.hours(0);</span>&nbsp; <span class='diff-add'> /* falls through */</span>&nbsp; <span class='diff-add'> case 'hour':</span>&nbsp; <span class='diff-add'> this.minutes(0);</span>&nbsp; <span class='diff-add'> /* falls through */</span>&nbsp; <span class='diff-add'> case 'minute':</span>&nbsp; <span class='diff-add'> this.seconds(0);</span>&nbsp; <span class='diff-add'> /* falls through */</span>&nbsp; <span class='diff-add'> case 'second':</span>&nbsp; <span class='diff-add'> this.milliseconds(0);</span>&nbsp; <span class='diff-add'> /* falls through */</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // weeks are a special case</span>&nbsp; <span class='diff-add'> if (units === 'week') {</span>&nbsp; <span class='diff-add'> this.weekday(0);</span>&nbsp; <span class='diff-add'> } else if (units === 'isoWeek') {</span>&nbsp; <span class='diff-add'> this.isoWeekday(1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // quarters are also special</span>&nbsp; <span class='diff-add'> if (units === 'quarter') {</span>&nbsp; <span class='diff-add'> this.month(Math.floor(this.month() / 3) * 3);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> endOf: function (units) {</span>&nbsp; <span class='diff-add'> units = normalizeUnits(units);</span>&nbsp; <span class='diff-add'> if (units === undefined || units === 'millisecond') {</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isAfter: function (input, units) {</span>&nbsp; <span class='diff-add'> var inputMs;</span>&nbsp; <span class='diff-add'> units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');</span>&nbsp; <span class='diff-add'> if (units === 'millisecond') {</span>&nbsp; <span class='diff-add'> input = moment.isMoment(input) ? input : moment(input);</span>&nbsp; <span class='diff-add'> return +this > +input;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> inputMs = moment.isMoment(input) ? +input : +moment(input);</span>&nbsp; <span class='diff-add'> return inputMs < +this.clone().startOf(units);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isBefore: function (input, units) {</span>&nbsp; <span class='diff-add'> var inputMs;</span>&nbsp; <span class='diff-add'> units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');</span>&nbsp; <span class='diff-add'> if (units === 'millisecond') {</span>&nbsp; <span class='diff-add'> input = moment.isMoment(input) ? input : moment(input);</span>&nbsp; <span class='diff-add'> return +this < +input;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> inputMs = moment.isMoment(input) ? +input : +moment(input);</span>&nbsp; <span class='diff-add'> return +this.clone().endOf(units) < inputMs;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isSame: function (input, units) {</span>&nbsp; <span class='diff-add'> var inputMs;</span>&nbsp; <span class='diff-add'> units = normalizeUnits(units || 'millisecond');</span>&nbsp; <span class='diff-add'> if (units === 'millisecond') {</span>&nbsp; <span class='diff-add'> input = moment.isMoment(input) ? input : moment(input);</span>&nbsp; <span class='diff-add'> return +this === +input;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> inputMs = +moment(input);</span>&nbsp; <span class='diff-add'> return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> min: deprecate(</span>&nbsp; <span class='diff-add'> 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',</span>&nbsp; <span class='diff-add'> function (other) {</span>&nbsp; <span class='diff-add'> other = moment.apply(null, arguments);</span>&nbsp; <span class='diff-add'> return other < this ? this : other;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ),</span>&nbsp; <span class='diff-add'> max: deprecate(</span>&nbsp; <span class='diff-add'> 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',</span>&nbsp; <span class='diff-add'> function (other) {</span>&nbsp; <span class='diff-add'> other = moment.apply(null, arguments);</span>&nbsp; <span class='diff-add'> return other > this ? this : other;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ),</span>&nbsp; <span class='diff-add'> // keepLocalTime = true means only change the timezone, without</span>&nbsp; <span class='diff-add'> // affecting the local hour. So 5:31:26 +0300 --[zone(2, true)]--></span>&nbsp; <span class='diff-add'> // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist int zone</span>&nbsp; <span class='diff-add'> // +0200, so we adjust the time as needed, to be valid.</span>&nbsp; <span class='diff-add'> //</span>&nbsp; <span class='diff-add'> // Keeping the time actually adds/subtracts (one hour)</span>&nbsp; <span class='diff-add'> // from the actual represented time. That is why we call updateOffset</span>&nbsp; <span class='diff-add'> // a second time. In case it wants us to change the offset again</span>&nbsp; <span class='diff-add'> // _changeInProgress == true case, then we have to adjust, because</span>&nbsp; <span class='diff-add'> // there is no such time in the given timezone.</span>&nbsp; <span class='diff-add'> zone : function (input, keepLocalTime) {</span>&nbsp; <span class='diff-add'> var offset = this._offset || 0,</span>&nbsp; <span class='diff-add'> localAdjust;</span>&nbsp; <span class='diff-add'> if (input != null) {</span>&nbsp; <span class='diff-add'> if (typeof input === 'string') {</span>&nbsp; <span class='diff-add'> input = timezoneMinutesFromString(input);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (Math.abs(input) < 16) {</span>&nbsp; <span class='diff-add'> input = input * 60;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!this._isUTC && keepLocalTime) {</span>&nbsp; <span class='diff-add'> localAdjust = this._dateTzOffset();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._offset = input;</span>&nbsp; <span class='diff-add'> this._isUTC = true;</span>&nbsp; <span class='diff-add'> if (localAdjust != null) {</span>&nbsp; <span class='diff-add'> this.subtract(localAdjust, 'm');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (offset !== input) {</span>&nbsp; <span class='diff-add'> if (!keepLocalTime || this._changeInProgress) {</span>&nbsp; <span class='diff-add'> addOrSubtractDurationFromMoment(this,</span>&nbsp; <span class='diff-add'> moment.duration(offset - input, 'm'), 1, false);</span>&nbsp; <span class='diff-add'> } else if (!this._changeInProgress) {</span>&nbsp; <span class='diff-add'> this._changeInProgress = true;</span>&nbsp; <span class='diff-add'> moment.updateOffset(this, true);</span>&nbsp; <span class='diff-add'> this._changeInProgress = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return this._isUTC ? offset : this._dateTzOffset();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> zoneAbbr : function () {</span>&nbsp; <span class='diff-add'> return this._isUTC ? 'UTC' : '';</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> zoneName : function () {</span>&nbsp; <span class='diff-add'> return this._isUTC ? 'Coordinated Universal Time' : '';</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> parseZone : function () {</span>&nbsp; <span class='diff-add'> if (this._tzm) {</span>&nbsp; <span class='diff-add'> this.zone(this._tzm);</span>&nbsp; <span class='diff-add'> } else if (typeof this._i === 'string') {</span>&nbsp; <span class='diff-add'> this.zone(this._i);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> hasAlignedHourOffset : function (input) {</span>&nbsp; <span class='diff-add'> if (!input) {</span>&nbsp; <span class='diff-add'> input = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> input = moment(input).zone();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return (this.zone() - input) % 60 === 0;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> daysInMonth : function () {</span>&nbsp; <span class='diff-add'> return daysInMonth(this.year(), this.month());</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> dayOfYear : function (input) {</span>&nbsp; <span class='diff-add'> var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;</span>&nbsp; <span class='diff-add'> return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> quarter : function (input) {</span>&nbsp; <span class='diff-add'> return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> weekYear : function (input) {</span>&nbsp; <span class='diff-add'> var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;</span>&nbsp; <span class='diff-add'> return input == null ? year : this.add((input - year), 'y');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isoWeekYear : function (input) {</span>&nbsp; <span class='diff-add'> var year = weekOfYear(this, 1, 4).year;</span>&nbsp; <span class='diff-add'> return input == null ? year : this.add((input - year), 'y');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> week : function (input) {</span>&nbsp; <span class='diff-add'> var week = this.localeData().week(this);</span>&nbsp; <span class='diff-add'> return input == null ? week : this.add((input - week) * 7, 'd');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isoWeek : function (input) {</span>&nbsp; <span class='diff-add'> var week = weekOfYear(this, 1, 4).week;</span>&nbsp; <span class='diff-add'> return input == null ? week : this.add((input - week) * 7, 'd');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> weekday : function (input) {</span>&nbsp; <span class='diff-add'> var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;</span>&nbsp; <span class='diff-add'> return input == null ? weekday : this.add(input - weekday, 'd');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isoWeekday : function (input) {</span>&nbsp; <span class='diff-add'> // behaves the same as moment#day except</span>&nbsp; <span class='diff-add'> // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)</span>&nbsp; <span class='diff-add'> // as a setter, sunday should belong to the previous week.</span>&nbsp; <span class='diff-add'> return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> isoWeeksInYear : function () {</span>&nbsp; <span class='diff-add'> return weeksInYear(this.year(), 1, 4);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> weeksInYear : function () {</span>&nbsp; <span class='diff-add'> var weekInfo = this.localeData()._week;</span>&nbsp; <span class='diff-add'> return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> get : function (units) {</span>&nbsp; <span class='diff-add'> units = normalizeUnits(units);</span>&nbsp; <span class='diff-add'> return this[units]();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> set : function (units, value) {</span>&nbsp; <span class='diff-add'> units = normalizeUnits(units);</span>&nbsp; <span class='diff-add'> if (typeof this[units] === 'function') {</span>&nbsp; <span class='diff-add'> this[units](value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> // If passed a locale key, it will set the locale for this</span>&nbsp; <span class='diff-add'> // instance. Otherwise, it will return the locale configuration</span>&nbsp; <span class='diff-add'> // variables for this instance.</span>&nbsp; <span class='diff-add'> locale : function (key) {</span>&nbsp; <span class='diff-add'> var newLocaleData;</span>&nbsp; <span class='diff-add'> if (key === undefined) {</span>&nbsp; <span class='diff-add'> return this._locale._abbr;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> newLocaleData = moment.localeData(key);</span>&nbsp; <span class='diff-add'> if (newLocaleData != null) {</span>&nbsp; <span class='diff-add'> this._locale = newLocaleData;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> lang : deprecate(</span>&nbsp; <span class='diff-add'> 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',</span>&nbsp; <span class='diff-add'> function (key) {</span>&nbsp; <span class='diff-add'> if (key === undefined) {</span>&nbsp; <span class='diff-add'> return this.localeData();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return this.locale(key);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ),</span>&nbsp; <span class='diff-add'> localeData : function () {</span>&nbsp; <span class='diff-add'> return this._locale;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _dateTzOffset : function () {</span>&nbsp; <span class='diff-add'> // On Firefox.24 Date#getTimezoneOffset returns a floating point.</span>&nbsp; <span class='diff-add'> // https://github.com/moment/moment/pull/1871</span>&nbsp; <span class='diff-add'> return Math.round(this._d.getTimezoneOffset() / 15) * 15;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> function rawMonthSetter(mom, value) {</span>&nbsp; <span class='diff-add'> var dayOfMonth;</span>&nbsp; <span class='diff-add'> // TODO: Move this out of here!</span>&nbsp; <span class='diff-add'> if (typeof value === 'string') {</span>&nbsp; <span class='diff-add'> value = mom.localeData().monthsParse(value);</span>&nbsp; <span class='diff-add'> // TODO: Another silent failure?</span>&nbsp; <span class='diff-add'> if (typeof value !== 'number') {</span>&nbsp; <span class='diff-add'> return mom;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> dayOfMonth = Math.min(mom.date(),</span>&nbsp; <span class='diff-add'> daysInMonth(mom.year(), value));</span>&nbsp; <span class='diff-add'> mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);</span>&nbsp; <span class='diff-add'> return mom;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function rawGetter(mom, unit) {</span>&nbsp; <span class='diff-add'> return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function rawSetter(mom, unit, value) {</span>&nbsp; <span class='diff-add'> if (unit === 'Month') {</span>&nbsp; <span class='diff-add'> return rawMonthSetter(mom, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function makeAccessor(unit, keepTime) {</span>&nbsp; <span class='diff-add'> return function (value) {</span>&nbsp; <span class='diff-add'> if (value != null) {</span>&nbsp; <span class='diff-add'> rawSetter(this, unit, value);</span>&nbsp; <span class='diff-add'> moment.updateOffset(this, keepTime);</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return rawGetter(this, unit);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false);</span>&nbsp; <span class='diff-add'> moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false);</span>&nbsp; <span class='diff-add'> moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false);</span>&nbsp; <span class='diff-add'> // Setting the hour should keep the time, because the user explicitly</span>&nbsp; <span class='diff-add'> // specified which hour he wants. So trying to maintain the same hour (in</span>&nbsp; <span class='diff-add'> // a new timezone) makes sense. Adding/subtracting hours does not follow</span>&nbsp; <span class='diff-add'> // this rule.</span>&nbsp; <span class='diff-add'> moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true);</span>&nbsp; <span class='diff-add'> // moment.fn.month is defined separately</span>&nbsp; <span class='diff-add'> moment.fn.date = makeAccessor('Date', true);</span>&nbsp; <span class='diff-add'> moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true));</span>&nbsp; <span class='diff-add'> moment.fn.year = makeAccessor('FullYear', true);</span>&nbsp; <span class='diff-add'> moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true));</span>&nbsp; <span class='diff-add'> // add plural methods</span>&nbsp; <span class='diff-add'> moment.fn.days = moment.fn.day;</span>&nbsp; <span class='diff-add'> moment.fn.months = moment.fn.month;</span>&nbsp; <span class='diff-add'> moment.fn.weeks = moment.fn.week;</span>&nbsp; <span class='diff-add'> moment.fn.isoWeeks = moment.fn.isoWeek;</span>&nbsp; <span class='diff-add'> moment.fn.quarters = moment.fn.quarter;</span>&nbsp; <span class='diff-add'> // add aliased format methods</span>&nbsp; <span class='diff-add'> moment.fn.toJSON = moment.fn.toISOString;</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Duration Prototype</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> function daysToYears (days) {</span>&nbsp; <span class='diff-add'> // 400 years have 146097 days (taking into account leap year rules)</span>&nbsp; <span class='diff-add'> return days * 400 / 146097;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function yearsToDays (years) {</span>&nbsp; <span class='diff-add'> // years * 365 + absRound(years / 4) -</span>&nbsp; <span class='diff-add'> // absRound(years / 100) + absRound(years / 400);</span>&nbsp; <span class='diff-add'> return years * 146097 / 400;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> extend(moment.duration.fn = Duration.prototype, {</span>&nbsp; <span class='diff-add'> _bubble : function () {</span>&nbsp; <span class='diff-add'> var milliseconds = this._milliseconds,</span>&nbsp; <span class='diff-add'> days = this._days,</span>&nbsp; <span class='diff-add'> months = this._months,</span>&nbsp; <span class='diff-add'> data = this._data,</span>&nbsp; <span class='diff-add'> seconds, minutes, hours, years = 0;</span>&nbsp; <span class='diff-add'> // The following code bubbles up values, see the tests for</span>&nbsp; <span class='diff-add'> // examples of what that means.</span>&nbsp; <span class='diff-add'> data.milliseconds = milliseconds % 1000;</span>&nbsp; <span class='diff-add'> seconds = absRound(milliseconds / 1000);</span>&nbsp; <span class='diff-add'> data.seconds = seconds % 60;</span>&nbsp; <span class='diff-add'> minutes = absRound(seconds / 60);</span>&nbsp; <span class='diff-add'> data.minutes = minutes % 60;</span>&nbsp; <span class='diff-add'> hours = absRound(minutes / 60);</span>&nbsp; <span class='diff-add'> data.hours = hours % 24;</span>&nbsp; <span class='diff-add'> days += absRound(hours / 24);</span>&nbsp; <span class='diff-add'> // Accurately convert days to years, assume start from year 0.</span>&nbsp; <span class='diff-add'> years = absRound(daysToYears(days));</span>&nbsp; <span class='diff-add'> days -= absRound(yearsToDays(years));</span>&nbsp; <span class='diff-add'> // 30 days to a month</span>&nbsp; <span class='diff-add'> // TODO (iskren): Use anchor date (like 1st Jan) to compute this.</span>&nbsp; <span class='diff-add'> months += absRound(days / 30);</span>&nbsp; <span class='diff-add'> days %= 30;</span>&nbsp; <span class='diff-add'> // 12 months -> 1 year</span>&nbsp; <span class='diff-add'> years += absRound(months / 12);</span>&nbsp; <span class='diff-add'> months %= 12;</span>&nbsp; <span class='diff-add'> data.days = days;</span>&nbsp; <span class='diff-add'> data.months = months;</span>&nbsp; <span class='diff-add'> data.years = years;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> abs : function () {</span>&nbsp; <span class='diff-add'> this._milliseconds = Math.abs(this._milliseconds);</span>&nbsp; <span class='diff-add'> this._days = Math.abs(this._days);</span>&nbsp; <span class='diff-add'> this._months = Math.abs(this._months);</span>&nbsp; <span class='diff-add'> this._data.milliseconds = Math.abs(this._data.milliseconds);</span>&nbsp; <span class='diff-add'> this._data.seconds = Math.abs(this._data.seconds);</span>&nbsp; <span class='diff-add'> this._data.minutes = Math.abs(this._data.minutes);</span>&nbsp; <span class='diff-add'> this._data.hours = Math.abs(this._data.hours);</span>&nbsp; <span class='diff-add'> this._data.months = Math.abs(this._data.months);</span>&nbsp; <span class='diff-add'> this._data.years = Math.abs(this._data.years);</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> weeks : function () {</span>&nbsp; <span class='diff-add'> return absRound(this.days() / 7);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> valueOf : function () {</span>&nbsp; <span class='diff-add'> return this._milliseconds +</span>&nbsp; <span class='diff-add'> this._days * 864e5 +</span>&nbsp; <span class='diff-add'> (this._months % 12) * 2592e6 +</span>&nbsp; <span class='diff-add'> toInt(this._months / 12) * 31536e6;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> humanize : function (withSuffix) {</span>&nbsp; <span class='diff-add'> var output = relativeTime(this, !withSuffix, this.localeData());</span>&nbsp; <span class='diff-add'> if (withSuffix) {</span>&nbsp; <span class='diff-add'> output = this.localeData().pastFuture(+this, output);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.localeData().postformat(output);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> add : function (input, val) {</span>&nbsp; <span class='diff-add'> // supports only 2.0-style add(1, 's') or add(moment)</span>&nbsp; <span class='diff-add'> var dur = moment.duration(input, val);</span>&nbsp; <span class='diff-add'> this._milliseconds += dur._milliseconds;</span>&nbsp; <span class='diff-add'> this._days += dur._days;</span>&nbsp; <span class='diff-add'> this._months += dur._months;</span>&nbsp; <span class='diff-add'> this._bubble();</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> subtract : function (input, val) {</span>&nbsp; <span class='diff-add'> var dur = moment.duration(input, val);</span>&nbsp; <span class='diff-add'> this._milliseconds -= dur._milliseconds;</span>&nbsp; <span class='diff-add'> this._days -= dur._days;</span>&nbsp; <span class='diff-add'> this._months -= dur._months;</span>&nbsp; <span class='diff-add'> this._bubble();</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> get : function (units) {</span>&nbsp; <span class='diff-add'> units = normalizeUnits(units);</span>&nbsp; <span class='diff-add'> return this[units.toLowerCase() + 's']();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> as : function (units) {</span>&nbsp; <span class='diff-add'> var days, months;</span>&nbsp; <span class='diff-add'> units = normalizeUnits(units);</span>&nbsp; <span class='diff-add'> if (units === 'month' || units === 'year') {</span>&nbsp; <span class='diff-add'> days = this._days + this._milliseconds / 864e5;</span>&nbsp; <span class='diff-add'> months = this._months + daysToYears(days) * 12;</span>&nbsp; <span class='diff-add'> return units === 'month' ? months : months / 12;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // handle milliseconds separately because of floating point math errors (issue #1867)</span>&nbsp; <span class='diff-add'> days = this._days + Math.round(yearsToDays(this._months / 12));</span>&nbsp; <span class='diff-add'> switch (units) {</span>&nbsp; <span class='diff-add'> case 'week': return days / 7 + this._milliseconds / 6048e5;</span>&nbsp; <span class='diff-add'> case 'day': return days + this._milliseconds / 864e5;</span>&nbsp; <span class='diff-add'> case 'hour': return days * 24 + this._milliseconds / 36e5;</span>&nbsp; <span class='diff-add'> case 'minute': return days * 24 * 60 + this._milliseconds / 6e4;</span>&nbsp; <span class='diff-add'> case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000;</span>&nbsp; <span class='diff-add'> // Math.floor prevents floating point math errors here</span>&nbsp; <span class='diff-add'> case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds;</span>&nbsp; <span class='diff-add'> default: throw new Error('Unknown unit ' + units);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> lang : moment.fn.lang,</span>&nbsp; <span class='diff-add'> locale : moment.fn.locale,</span>&nbsp; <span class='diff-add'> toIsoString : deprecate(</span>&nbsp; <span class='diff-add'> 'toIsoString() is deprecated. Please use toISOString() instead ' +</span>&nbsp; <span class='diff-add'> '(notice the capitals)',</span>&nbsp; <span class='diff-add'> function () {</span>&nbsp; <span class='diff-add'> return this.toISOString();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ),</span>&nbsp; <span class='diff-add'> toISOString : function () {</span>&nbsp; <span class='diff-add'> // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js</span>&nbsp; <span class='diff-add'> var years = Math.abs(this.years()),</span>&nbsp; <span class='diff-add'> months = Math.abs(this.months()),</span>&nbsp; <span class='diff-add'> days = Math.abs(this.days()),</span>&nbsp; <span class='diff-add'> hours = Math.abs(this.hours()),</span>&nbsp; <span class='diff-add'> minutes = Math.abs(this.minutes()),</span>&nbsp; <span class='diff-add'> seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);</span>&nbsp; <span class='diff-add'> if (!this.asSeconds()) {</span>&nbsp; <span class='diff-add'> // this is the same as C#'s (Noda) and python (isodate)...</span>&nbsp; <span class='diff-add'> // but not other JS (goog.date)</span>&nbsp; <span class='diff-add'> return 'P0D';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return (this.asSeconds() < 0 ? '-' : '') +</span>&nbsp; <span class='diff-add'> 'P' +</span>&nbsp; <span class='diff-add'> (years ? years + 'Y' : '') +</span>&nbsp; <span class='diff-add'> (months ? months + 'M' : '') +</span>&nbsp; <span class='diff-add'> (days ? days + 'D' : '') +</span>&nbsp; <span class='diff-add'> ((hours || minutes || seconds) ? 'T' : '') +</span>&nbsp; <span class='diff-add'> (hours ? hours + 'H' : '') +</span>&nbsp; <span class='diff-add'> (minutes ? minutes + 'M' : '') +</span>&nbsp; <span class='diff-add'> (seconds ? seconds + 'S' : '');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> localeData : function () {</span>&nbsp; <span class='diff-add'> return this._locale;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> moment.duration.fn.toString = moment.duration.fn.toISOString;</span>&nbsp; <span class='diff-add'> function makeDurationGetter(name) {</span>&nbsp; <span class='diff-add'> moment.duration.fn[name] = function () {</span>&nbsp; <span class='diff-add'> return this._data[name];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for (i in unitMillisecondFactors) {</span>&nbsp; <span class='diff-add'> if (hasOwnProp(unitMillisecondFactors, i)) {</span>&nbsp; <span class='diff-add'> makeDurationGetter(i.toLowerCase());</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> moment.duration.fn.asMilliseconds = function () {</span>&nbsp; <span class='diff-add'> return this.as('ms');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.duration.fn.asSeconds = function () {</span>&nbsp; <span class='diff-add'> return this.as('s');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.duration.fn.asMinutes = function () {</span>&nbsp; <span class='diff-add'> return this.as('m');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.duration.fn.asHours = function () {</span>&nbsp; <span class='diff-add'> return this.as('h');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.duration.fn.asDays = function () {</span>&nbsp; <span class='diff-add'> return this.as('d');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.duration.fn.asWeeks = function () {</span>&nbsp; <span class='diff-add'> return this.as('weeks');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.duration.fn.asMonths = function () {</span>&nbsp; <span class='diff-add'> return this.as('M');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> moment.duration.fn.asYears = function () {</span>&nbsp; <span class='diff-add'> return this.as('y');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Default Locale</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> // Set default locale, other locale will inherit from English.</span>&nbsp; <span class='diff-add'> moment.locale('en', {</span>&nbsp; <span class='diff-add'> ordinalParse: /\d{1,2}(th|st|nd|rd)/,</span>&nbsp; <span class='diff-add'> ordinal : function (number) {</span>&nbsp; <span class='diff-add'> var b = number % 10,</span>&nbsp; <span class='diff-add'> output = (toInt(number % 100 / 10) === 1) ? 'th' :</span>&nbsp; <span class='diff-add'> (b === 1) ? 'st' :</span>&nbsp; <span class='diff-add'> (b === 2) ? 'nd' :</span>&nbsp; <span class='diff-add'> (b === 3) ? 'rd' : 'th';</span>&nbsp; <span class='diff-add'> return number + output;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> /* EMBED_LOCALES */</span>&nbsp; <span class='diff-add'> /************************************</span>&nbsp; <span class='diff-add'> Exposing Moment</span>&nbsp; <span class='diff-add'> ************************************/</span>&nbsp; <span class='diff-add'> function makeGlobal(shouldDeprecate) {</span>&nbsp; <span class='diff-add'> /*global ender:false */</span>&nbsp; <span class='diff-add'> if (typeof ender !== 'undefined') {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> oldGlobalMoment = globalScope.moment;</span>&nbsp; <span class='diff-add'> if (shouldDeprecate) {</span>&nbsp; <span class='diff-add'> globalScope.moment = deprecate(</span>&nbsp; <span class='diff-add'> 'Accessing Moment through the global scope is ' +</span>&nbsp; <span class='diff-add'> 'deprecated, and will be removed in an upcoming ' +</span>&nbsp; <span class='diff-add'> 'release.',</span>&nbsp; <span class='diff-add'> moment);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> globalScope.moment = moment;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // CommonJS module is defined</span>&nbsp; <span class='diff-add'> if (hasModule) {</span>&nbsp; <span class='diff-add'> module.exports = moment;</span>&nbsp; <span class='diff-add'> } else if (typeof define === 'function' && define.amd) {</span>&nbsp; <span class='diff-add'> define('moment', function (require, exports, module) {</span>&nbsp; <span class='diff-add'> if (module.config && module.config() && module.config().noGlobal === true) {</span>&nbsp; <span class='diff-add'> // release the global variable</span>&nbsp; <span class='diff-add'> globalScope.moment = oldGlobalMoment;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return moment;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> makeGlobal(true);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> makeGlobal();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'>}).call(this);</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/multiplex.js b/ipynb/Array-feature-overlap-05_files/multiplex.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..6a95b32</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/multiplex.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../../lib/codemirror"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../../lib/codemirror"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'>"use strict";</span>&nbsp; <span class='diff-add'>CodeMirror.multiplexingMode = function(outer /*, others */) {</span>&nbsp; <span class='diff-add'> // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects</span>&nbsp; <span class='diff-add'> var others = Array.prototype.slice.call(arguments, 1);</span>&nbsp; <span class='diff-add'> var n_others = others.length;</span>&nbsp; <span class='diff-add'> function indexOf(string, pattern, from) {</span>&nbsp; <span class='diff-add'> if (typeof pattern == "string") return string.indexOf(pattern, from);</span>&nbsp; <span class='diff-add'> var m = pattern.exec(from ? string.slice(from) : string);</span>&nbsp; <span class='diff-add'> return m ? m.index + from : -1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> startState: function() {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> outer: CodeMirror.startState(outer),</span>&nbsp; <span class='diff-add'> innerActive: null,</span>&nbsp; <span class='diff-add'> inner: null</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> copyState: function(state) {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> outer: CodeMirror.copyState(outer, state.outer),</span>&nbsp; <span class='diff-add'> innerActive: state.innerActive,</span>&nbsp; <span class='diff-add'> inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner)</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> token: function(stream, state) {</span>&nbsp; <span class='diff-add'> if (!state.innerActive) {</span>&nbsp; <span class='diff-add'> var cutOff = Infinity, oldContent = stream.string;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < n_others; ++i) {</span>&nbsp; <span class='diff-add'> var other = others[i];</span>&nbsp; <span class='diff-add'> var found = indexOf(oldContent, other.open, stream.pos);</span>&nbsp; <span class='diff-add'> if (found == stream.pos) {</span>&nbsp; <span class='diff-add'> stream.match(other.open);</span>&nbsp; <span class='diff-add'> state.innerActive = other;</span>&nbsp; <span class='diff-add'> state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0);</span>&nbsp; <span class='diff-add'> return other.delimStyle;</span>&nbsp; <span class='diff-add'> } else if (found != -1 && found < cutOff) {</span>&nbsp; <span class='diff-add'> cutOff = found;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);</span>&nbsp; <span class='diff-add'> var outerToken = outer.token(stream, state.outer);</span>&nbsp; <span class='diff-add'> if (cutOff != Infinity) stream.string = oldContent;</span>&nbsp; <span class='diff-add'> return outerToken;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var curInner = state.innerActive, oldContent = stream.string;</span>&nbsp; <span class='diff-add'> if (!curInner.close && stream.sol()) {</span>&nbsp; <span class='diff-add'> state.innerActive = state.inner = null;</span>&nbsp; <span class='diff-add'> return this.token(stream, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos) : -1;</span>&nbsp; <span class='diff-add'> if (found == stream.pos) {</span>&nbsp; <span class='diff-add'> stream.match(curInner.close);</span>&nbsp; <span class='diff-add'> state.innerActive = state.inner = null;</span>&nbsp; <span class='diff-add'> return curInner.delimStyle;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (found > -1) stream.string = oldContent.slice(0, found);</span>&nbsp; <span class='diff-add'> var innerToken = curInner.mode.token(stream, state.inner);</span>&nbsp; <span class='diff-add'> if (found > -1) stream.string = oldContent;</span>&nbsp; <span class='diff-add'> if (curInner.innerStyle) {</span>&nbsp; <span class='diff-add'> if (innerToken) innerToken = innerToken + ' ' + curInner.innerStyle;</span>&nbsp; <span class='diff-add'> else innerToken = curInner.innerStyle;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return innerToken;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> indent: function(state, textAfter) {</span>&nbsp; <span class='diff-add'> var mode = state.innerActive ? state.innerActive.mode : outer;</span>&nbsp; <span class='diff-add'> if (!mode.indent) return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> return mode.indent(state.innerActive ? state.inner : state.outer, textAfter);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> blankLine: function(state) {</span>&nbsp; <span class='diff-add'> var mode = state.innerActive ? state.innerActive.mode : outer;</span>&nbsp; <span class='diff-add'> if (mode.blankLine) {</span>&nbsp; <span class='diff-add'> mode.blankLine(state.innerActive ? state.inner : state.outer);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!state.innerActive) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < n_others; ++i) {</span>&nbsp; <span class='diff-add'> var other = others[i];</span>&nbsp; <span class='diff-add'> if (other.open === "\n") {</span>&nbsp; <span class='diff-add'> state.innerActive = other;</span>&nbsp; <span class='diff-add'> state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (state.innerActive.close === "\n") {</span>&nbsp; <span class='diff-add'> state.innerActive = state.inner = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> electricChars: outer.electricChars,</span>&nbsp; <span class='diff-add'> innerMode: function(state) {</span>&nbsp; <span class='diff-add'> return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/namespace.js b/ipynb/Array-feature-overlap-05_files/namespace.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..c7602d2</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/namespace.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>var IPython = IPython || {};</span>&nbsp; <span class='diff-add'>define([], function(){</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> IPython.version = "3.0.0";</span>&nbsp; <span class='diff-add'> IPython._target = '_blank';</span>&nbsp; <span class='diff-add'> return IPython;</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/notebook.js b/ipynb/Array-feature-overlap-05_files/notebook.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..f516106</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/notebook.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>/**</span>&nbsp; <span class='diff-add'> * @module notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>define(function (require) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var IPython = require('base/js/namespace');</span>&nbsp; <span class='diff-add'> var $ = require('jquery');</span>&nbsp; <span class='diff-add'> var utils = require('base/js/utils');</span>&nbsp; <span class='diff-add'> var dialog = require('base/js/dialog');</span>&nbsp; <span class='diff-add'> var cellmod = require('notebook/js/cell');</span>&nbsp; <span class='diff-add'> var textcell = require('notebook/js/textcell');</span>&nbsp; <span class='diff-add'> var codecell = require('notebook/js/codecell');</span>&nbsp; <span class='diff-add'> var moment = require('moment');</span>&nbsp; <span class='diff-add'> var configmod = require('services/config');</span>&nbsp; <span class='diff-add'> var session = require('services/sessions/session');</span>&nbsp; <span class='diff-add'> var celltoolbar = require('notebook/js/celltoolbar');</span>&nbsp; <span class='diff-add'> var marked = require('components/marked/lib/marked');</span>&nbsp; <span class='diff-add'> var CodeMirror = require('codemirror/lib/codemirror');</span>&nbsp; <span class='diff-add'> var runMode = require('codemirror/addon/runmode/runmode');</span>&nbsp; <span class='diff-add'> var mathjaxutils = require('notebook/js/mathjaxutils');</span>&nbsp; <span class='diff-add'> var keyboard = require('base/js/keyboard');</span>&nbsp; <span class='diff-add'> var tooltip = require('notebook/js/tooltip');</span>&nbsp; <span class='diff-add'> var default_celltoolbar = require('notebook/js/celltoolbarpresets/default');</span>&nbsp; <span class='diff-add'> var rawcell_celltoolbar = require('notebook/js/celltoolbarpresets/rawcell');</span>&nbsp; <span class='diff-add'> var slideshow_celltoolbar = require('notebook/js/celltoolbarpresets/slideshow');</span>&nbsp; <span class='diff-add'> var scrollmanager = require('notebook/js/scrollmanager');</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Contains and manages cells.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @class Notebook</span>&nbsp; <span class='diff-add'> * @param {string} selector</span>&nbsp; <span class='diff-add'> * @param {object} options - Dictionary of keyword arguments. </span>&nbsp; <span class='diff-add'> * @param {jQuery} options.events - selector of Events</span>&nbsp; <span class='diff-add'> * @param {KeyboardManager} options.keyboard_manager</span>&nbsp; <span class='diff-add'> * @param {Contents} options.contents</span>&nbsp; <span class='diff-add'> * @param {SaveWidget} options.save_widget</span>&nbsp; <span class='diff-add'> * @param {object} options.config</span>&nbsp; <span class='diff-add'> * @param {string} options.base_url</span>&nbsp; <span class='diff-add'> * @param {string} options.notebook_path</span>&nbsp; <span class='diff-add'> * @param {string} options.notebook_name</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var Notebook = function (selector, options) {</span>&nbsp; <span class='diff-add'> this.config = options.config;</span>&nbsp; <span class='diff-add'> this.class_config = new configmod.ConfigWithDefaults(this.config, </span>&nbsp; <span class='diff-add'> Notebook.options_default, 'Notebook');</span>&nbsp; <span class='diff-add'> this.base_url = options.base_url;</span>&nbsp; <span class='diff-add'> this.notebook_path = options.notebook_path;</span>&nbsp; <span class='diff-add'> this.notebook_name = options.notebook_name;</span>&nbsp; <span class='diff-add'> this.events = options.events;</span>&nbsp; <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span>&nbsp; <span class='diff-add'> this.contents = options.contents;</span>&nbsp; <span class='diff-add'> this.save_widget = options.save_widget;</span>&nbsp; <span class='diff-add'> this.tooltip = new tooltip.Tooltip(this.events);</span>&nbsp; <span class='diff-add'> this.ws_url = options.ws_url;</span>&nbsp; <span class='diff-add'> this._session_starting = false;</span>&nbsp; <span class='diff-add'> this.last_modified = null;</span>&nbsp; <span class='diff-add'> // Create default scroll manager.</span>&nbsp; <span class='diff-add'> this.scroll_manager = new scrollmanager.ScrollManager(this);</span>&nbsp; <span class='diff-add'> // TODO: This code smells (and the other `= this` line a couple lines down)</span>&nbsp; <span class='diff-add'> // We need a better way to deal with circular instance references.</span>&nbsp; <span class='diff-add'> this.keyboard_manager.notebook = this;</span>&nbsp; <span class='diff-add'> this.save_widget.notebook = this;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> mathjaxutils.init();</span>&nbsp; <span class='diff-add'> if (marked) {</span>&nbsp; <span class='diff-add'> marked.setOptions({</span>&nbsp; <span class='diff-add'> gfm : true,</span>&nbsp; <span class='diff-add'> tables: true,</span>&nbsp; <span class='diff-add'> // FIXME: probably want central config for CodeMirror theme when we have js config</span>&nbsp; <span class='diff-add'> langPrefix: "cm-s-ipython language-",</span>&nbsp; <span class='diff-add'> highlight: function(code, lang, callback) {</span>&nbsp; <span class='diff-add'> if (!lang) {</span>&nbsp; <span class='diff-add'> // no language, no highlight</span>&nbsp; <span class='diff-add'> if (callback) {</span>&nbsp; <span class='diff-add'> callback(null, code);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return code;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> utils.requireCodeMirrorMode(lang, function (spec) {</span>&nbsp; <span class='diff-add'> var el = document.createElement("div");</span>&nbsp; <span class='diff-add'> var mode = CodeMirror.getMode({}, spec);</span>&nbsp; <span class='diff-add'> if (!mode) {</span>&nbsp; <span class='diff-add'> console.log("No CodeMirror mode: " + lang);</span>&nbsp; <span class='diff-add'> callback(null, code);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> CodeMirror.runMode(code, spec, el);</span>&nbsp; <span class='diff-add'> callback(null, el.innerHTML);</span>&nbsp; <span class='diff-add'> } catch (err) {</span>&nbsp; <span class='diff-add'> console.log("Failed to highlight " + lang + " code", err);</span>&nbsp; <span class='diff-add'> callback(err, code);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, function (err) {</span>&nbsp; <span class='diff-add'> console.log("No CodeMirror mode: " + lang);</span>&nbsp; <span class='diff-add'> callback(err, code);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.element = $(selector);</span>&nbsp; <span class='diff-add'> this.element.scroll();</span>&nbsp; <span class='diff-add'> this.element.data("notebook", this);</span>&nbsp; <span class='diff-add'> this.next_prompt_number = 1;</span>&nbsp; <span class='diff-add'> this.session = null;</span>&nbsp; <span class='diff-add'> this.kernel = null;</span>&nbsp; <span class='diff-add'> this.clipboard = null;</span>&nbsp; <span class='diff-add'> this.undelete_backup = null;</span>&nbsp; <span class='diff-add'> this.undelete_index = null;</span>&nbsp; <span class='diff-add'> this.undelete_below = false;</span>&nbsp; <span class='diff-add'> this.paste_enabled = false;</span>&nbsp; <span class='diff-add'> this.writable = false;</span>&nbsp; <span class='diff-add'> // It is important to start out in command mode to match the intial mode</span>&nbsp; <span class='diff-add'> // of the KeyboardManager.</span>&nbsp; <span class='diff-add'> this.mode = 'command';</span>&nbsp; <span class='diff-add'> this.set_dirty(false);</span>&nbsp; <span class='diff-add'> this.metadata = {};</span>&nbsp; <span class='diff-add'> this._checkpoint_after_save = false;</span>&nbsp; <span class='diff-add'> this.last_checkpoint = null;</span>&nbsp; <span class='diff-add'> this.checkpoints = [];</span>&nbsp; <span class='diff-add'> this.autosave_interval = 0;</span>&nbsp; <span class='diff-add'> this.autosave_timer = null;</span>&nbsp; <span class='diff-add'> // autosave *at most* every two minutes</span>&nbsp; <span class='diff-add'> this.minimum_autosave_interval = 120000;</span>&nbsp; <span class='diff-add'> this.notebook_name_blacklist_re = /[\/\\:]/;</span>&nbsp; <span class='diff-add'> this.nbformat = 4; // Increment this when changing the nbformat</span>&nbsp; <span class='diff-add'> this.nbformat_minor = this.current_nbformat_minor = 0; // Increment this when changing the nbformat</span>&nbsp; <span class='diff-add'> this.codemirror_mode = 'ipython';</span>&nbsp; <span class='diff-add'> this.create_elements();</span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> this.kernel_selector = null;</span>&nbsp; <span class='diff-add'> this.dirty = null;</span>&nbsp; <span class='diff-add'> this.trusted = null;</span>&nbsp; <span class='diff-add'> this._fully_loaded = false;</span>&nbsp; <span class='diff-add'> // Trigger cell toolbar registration.</span>&nbsp; <span class='diff-add'> default_celltoolbar.register(this);</span>&nbsp; <span class='diff-add'> rawcell_celltoolbar.register(this);</span>&nbsp; <span class='diff-add'> slideshow_celltoolbar.register(this);</span>&nbsp; <span class='diff-add'> // prevent assign to miss-typed properties.</span>&nbsp; <span class='diff-add'> Object.seal(this);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Notebook.options_default = {</span>&nbsp; <span class='diff-add'> // can be any cell type, or the special values of</span>&nbsp; <span class='diff-add'> // 'above', 'below', or 'selected' to get the value from another cell.</span>&nbsp; <span class='diff-add'> default_cell_type: 'code'</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Create an HTML and CSS representation of the notebook.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.create_elements = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.element.attr('tabindex','-1');</span>&nbsp; <span class='diff-add'> this.container = $("<div/>").addClass("container").attr("id", "notebook-container");</span>&nbsp; <span class='diff-add'> // We add this end_space div to the end of the notebook div to:</span>&nbsp; <span class='diff-add'> // i) provide a margin between the last cell and the end of the notebook</span>&nbsp; <span class='diff-add'> // ii) to prevent the div from scrolling up when the last cell is being</span>&nbsp; <span class='diff-add'> // edited, but is too low on the page, which browsers will do automatically.</span>&nbsp; <span class='diff-add'> var end_space = $('<div/>').addClass('end_space');</span>&nbsp; <span class='diff-add'> end_space.dblclick(function (e) {</span>&nbsp; <span class='diff-add'> var ncells = that.ncells();</span>&nbsp; <span class='diff-add'> that.insert_cell_below('code',ncells-1);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.element.append(this.container);</span>&nbsp; <span class='diff-add'> this.container.after(end_space);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Bind JavaScript events: key presses and custom IPython events.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.events.on('set_next_input.Notebook', function (event, data) {</span>&nbsp; <span class='diff-add'> if (data.replace) {</span>&nbsp; <span class='diff-add'> data.cell.set_text(data.text);</span>&nbsp; <span class='diff-add'> data.cell.clear_output();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var index = that.find_cell_index(data.cell);</span>&nbsp; <span class='diff-add'> var new_cell = that.insert_cell_below('code',index);</span>&nbsp; <span class='diff-add'> new_cell.set_text(data.text);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> that.dirty = true;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('unrecognized_cell.Cell', function () {</span>&nbsp; <span class='diff-add'> that.warn_nbformat_minor();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('unrecognized_output.OutputArea', function () {</span>&nbsp; <span class='diff-add'> that.warn_nbformat_minor();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('set_dirty.Notebook', function (event, data) {</span>&nbsp; <span class='diff-add'> that.dirty = data.value;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('trust_changed.Notebook', function (event, trusted) {</span>&nbsp; <span class='diff-add'> that.trusted = trusted;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('select.Cell', function (event, data) {</span>&nbsp; <span class='diff-add'> var index = that.find_cell_index(data.cell);</span>&nbsp; <span class='diff-add'> that.select(index);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('edit_mode.Cell', function (event, data) {</span>&nbsp; <span class='diff-add'> that.handle_edit_mode(data.cell);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('command_mode.Cell', function (event, data) {</span>&nbsp; <span class='diff-add'> that.handle_command_mode(data.cell);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.events.on('spec_changed.Kernel', function(event, data) {</span>&nbsp; <span class='diff-add'> that.metadata.kernelspec = {</span>&nbsp; <span class='diff-add'> name: data.name,</span>&nbsp; <span class='diff-add'> display_name: data.spec.display_name,</span>&nbsp; <span class='diff-add'> language: data.spec.language,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // start session if the current session isn't already correct</span>&nbsp; <span class='diff-add'> if (!(that.session && that.session.kernel && that.session.kernel.name === data.name)) {</span>&nbsp; <span class='diff-add'> that.start_session(data.name);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_ready.Kernel', function(event, data) {</span>&nbsp; <span class='diff-add'> var kinfo = data.kernel.info_reply;</span>&nbsp; <span class='diff-add'> if (!kinfo.language_info) {</span>&nbsp; <span class='diff-add'> delete that.metadata.language_info;</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var langinfo = kinfo.language_info;</span>&nbsp; <span class='diff-add'> that.metadata.language_info = langinfo;</span>&nbsp; <span class='diff-add'> // Mode 'null' should be plain, unhighlighted text.</span>&nbsp; <span class='diff-add'> var cm_mode = langinfo.codemirror_mode || langinfo.name || 'null';</span>&nbsp; <span class='diff-add'> that.set_codemirror_mode(cm_mode);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var collapse_time = function (time) {</span>&nbsp; <span class='diff-add'> var app_height = $('#ipython-main-app').height(); // content height</span>&nbsp; <span class='diff-add'> var splitter_height = $('div#pager_splitter').outerHeight(true);</span>&nbsp; <span class='diff-add'> var new_height = app_height - splitter_height;</span>&nbsp; <span class='diff-add'> that.element.animate({height : new_height + 'px'}, time);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.element.bind('collapse_pager', function (event, extrap) {</span>&nbsp; <span class='diff-add'> var time = (extrap !== undefined) ? ((extrap.duration !== undefined ) ? extrap.duration : 'fast') : 'fast';</span>&nbsp; <span class='diff-add'> collapse_time(time);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var expand_time = function (time) {</span>&nbsp; <span class='diff-add'> var app_height = $('#ipython-main-app').height(); // content height</span>&nbsp; <span class='diff-add'> var splitter_height = $('div#pager_splitter').outerHeight(true);</span>&nbsp; <span class='diff-add'> var pager_height = $('div#pager').outerHeight(true);</span>&nbsp; <span class='diff-add'> var new_height = app_height - pager_height - splitter_height;</span>&nbsp; <span class='diff-add'> that.element.animate({height : new_height + 'px'}, time);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.element.bind('expand_pager', function (event, extrap) {</span>&nbsp; <span class='diff-add'> var time = (extrap !== undefined) ? ((extrap.duration !== undefined ) ? extrap.duration : 'fast') : 'fast';</span>&nbsp; <span class='diff-add'> expand_time(time);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Firefox 22 broke $(window).on("beforeunload")</span>&nbsp; <span class='diff-add'> // I'm not sure why or how.</span>&nbsp; <span class='diff-add'> window.onbeforeunload = function (e) {</span>&nbsp; <span class='diff-add'> // TODO: Make killing the kernel configurable.</span>&nbsp; <span class='diff-add'> var kill_kernel = false;</span>&nbsp; <span class='diff-add'> if (kill_kernel) {</span>&nbsp; <span class='diff-add'> that.session.delete();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // if we are autosaving, trigger an autosave on nav-away.</span>&nbsp; <span class='diff-add'> // still warn, because if we don't the autosave may fail.</span>&nbsp; <span class='diff-add'> if (that.dirty) {</span>&nbsp; <span class='diff-add'> if ( that.autosave_interval ) {</span>&nbsp; <span class='diff-add'> // schedule autosave in a timeout</span>&nbsp; <span class='diff-add'> // this gives you a chance to forcefully discard changes</span>&nbsp; <span class='diff-add'> // by reloading the page if you *really* want to.</span>&nbsp; <span class='diff-add'> // the timer doesn't start until you *dismiss* the dialog.</span>&nbsp; <span class='diff-add'> setTimeout(function () {</span>&nbsp; <span class='diff-add'> if (that.dirty) {</span>&nbsp; <span class='diff-add'> that.save_notebook();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, 1000);</span>&nbsp; <span class='diff-add'> return "Autosave in progress, latest changes may be lost.";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return "Unsaved changes will be lost.";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Null is the *only* return value that will make the browser not</span>&nbsp; <span class='diff-add'> // pop up the "don't leave" dialog.</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Trigger a warning dialog about missing functionality from newer minor versions</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.warn_nbformat_minor = function (event) {</span>&nbsp; <span class='diff-add'> var v = 'v' + this.nbformat + '.';</span>&nbsp; <span class='diff-add'> var orig_vs = v + this.nbformat_minor;</span>&nbsp; <span class='diff-add'> var this_vs = v + this.current_nbformat_minor;</span>&nbsp; <span class='diff-add'> var msg = "This notebook is version " + orig_vs + ", but we only fully support up to " +</span>&nbsp; <span class='diff-add'> this_vs + ". You can still work with this notebook, but cell and output types " +</span>&nbsp; <span class='diff-add'> "introduced in later notebook versions will not be available.";</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> notebook: this,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span>&nbsp; <span class='diff-add'> title : "Newer Notebook",</span>&nbsp; <span class='diff-add'> body : msg,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> OK : {</span>&nbsp; <span class='diff-add'> "class" : "btn-danger"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set the dirty flag, and trigger the set_dirty.Notebook event</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.set_dirty = function (value) {</span>&nbsp; <span class='diff-add'> if (value === undefined) {</span>&nbsp; <span class='diff-add'> value = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.dirty === value) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.events.trigger('set_dirty.Notebook', {value: value});</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Scroll the top of the page to a given cell.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} index - An index of the cell to view</span>&nbsp; <span class='diff-add'> * @param {integer} time - Animation time in milliseconds</span>&nbsp; <span class='diff-add'> * @return {integer} Pixel offset from the top of the container</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.scroll_to_cell = function (index, time) {</span>&nbsp; <span class='diff-add'> var cells = this.get_cells();</span>&nbsp; <span class='diff-add'> time = time || 0;</span>&nbsp; <span class='diff-add'> index = Math.min(cells.length-1,index);</span>&nbsp; <span class='diff-add'> index = Math.max(0 ,index);</span>&nbsp; <span class='diff-add'> var scroll_value = cells[index].element.position().top-cells[0].element.position().top ;</span>&nbsp; <span class='diff-add'> this.scroll_manager.element.animate({scrollTop:scroll_value}, time);</span>&nbsp; <span class='diff-add'> return scroll_value;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Scroll to the bottom of the page.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.scroll_to_bottom = function () {</span>&nbsp; <span class='diff-add'> this.scroll_manager.element.animate({scrollTop:this.element.get(0).scrollHeight}, 0);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Scroll to the top of the page.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.scroll_to_top = function () {</span>&nbsp; <span class='diff-add'> this.scroll_manager.element.animate({scrollTop:0}, 0);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Edit Notebook metadata</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Display a dialog that allows the user to edit the Notebook's metadata.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.edit_metadata = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> dialog.edit_metadata({</span>&nbsp; <span class='diff-add'> md: this.metadata, </span>&nbsp; <span class='diff-add'> callback: function (md) {</span>&nbsp; <span class='diff-add'> that.metadata = md;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> name: 'Notebook',</span>&nbsp; <span class='diff-add'> notebook: this,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager});</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Cell indexing, retrieval, etc.</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get all cell elements in the notebook.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @return {jQuery} A selector of all cell elements</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.get_cell_elements = function () {</span>&nbsp; <span class='diff-add'> return this.container.find(".cell").not('.cell .cell');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get a particular cell element.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} index An index of a cell to select</span>&nbsp; <span class='diff-add'> * @return {jQuery} A selector of the given cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.get_cell_element = function (index) {</span>&nbsp; <span class='diff-add'> var result = null;</span>&nbsp; <span class='diff-add'> var e = this.get_cell_elements().eq(index);</span>&nbsp; <span class='diff-add'> if (e.length !== 0) {</span>&nbsp; <span class='diff-add'> result = e;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Try to get a particular cell by msg_id.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {string} msg_id A message UUID</span>&nbsp; <span class='diff-add'> * @return {Cell} Cell or null if no cell was found.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.get_msg_cell = function (msg_id) {</span>&nbsp; <span class='diff-add'> return codecell.CodeCell.msg_cells[msg_id] || null;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Count the cells in this notebook.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @return {integer} The number of cells in this notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.ncells = function () {</span>&nbsp; <span class='diff-add'> return this.get_cell_elements().length;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get all Cell objects in this notebook.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @return {Array} This notebook's Cell objects</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.get_cells = function () {</span>&nbsp; <span class='diff-add'> // TODO: we are often calling cells as cells()[i], which we should optimize</span>&nbsp; <span class='diff-add'> // to cells(i) or a new method.</span>&nbsp; <span class='diff-add'> return this.get_cell_elements().toArray().map(function (e) {</span>&nbsp; <span class='diff-add'> return $(e).data("cell");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get a Cell objects from this notebook.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} index - An index of a cell to retrieve</span>&nbsp; <span class='diff-add'> * @return {Cell} Cell or null if no cell was found.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.get_cell = function (index) {</span>&nbsp; <span class='diff-add'> var result = null;</span>&nbsp; <span class='diff-add'> var ce = this.get_cell_element(index);</span>&nbsp; <span class='diff-add'> if (ce !== null) {</span>&nbsp; <span class='diff-add'> result = ce.data('cell');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get the cell below a given cell.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {Cell} cell</span>&nbsp; <span class='diff-add'> * @return {Cell} the next cell or null if no cell was found.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.get_next_cell = function (cell) {</span>&nbsp; <span class='diff-add'> var result = null;</span>&nbsp; <span class='diff-add'> var index = this.find_cell_index(cell);</span>&nbsp; <span class='diff-add'> if (this.is_valid_cell_index(index+1)) {</span>&nbsp; <span class='diff-add'> result = this.get_cell(index+1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get the cell above a given cell.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {Cell} cell</span>&nbsp; <span class='diff-add'> * @return {Cell} The previous cell or null if no cell was found.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.get_prev_cell = function (cell) {</span>&nbsp; <span class='diff-add'> var result = null;</span>&nbsp; <span class='diff-add'> var index = this.find_cell_index(cell);</span>&nbsp; <span class='diff-add'> if (index !== null && index > 0) {</span>&nbsp; <span class='diff-add'> result = this.get_cell(index-1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get the numeric index of a given cell.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {Cell} cell</span>&nbsp; <span class='diff-add'> * @return {integer} The cell's numeric index or null if no cell was found.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.find_cell_index = function (cell) {</span>&nbsp; <span class='diff-add'> var result = null;</span>&nbsp; <span class='diff-add'> this.get_cell_elements().filter(function (index) {</span>&nbsp; <span class='diff-add'> if ($(this).data("cell") === cell) {</span>&nbsp; <span class='diff-add'> result = index;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Return given index if defined, or the selected index if not.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} [index] - A cell's index</span>&nbsp; <span class='diff-add'> * @return {integer} cell index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.index_or_selected = function (index) {</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> if (index === undefined || index === null) {</span>&nbsp; <span class='diff-add'> i = this.get_selected_index();</span>&nbsp; <span class='diff-add'> if (i === null) {</span>&nbsp; <span class='diff-add'> i = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> i = index;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return i;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get the currently selected cell.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @return {Cell} The selected cell</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.get_selected_cell = function () {</span>&nbsp; <span class='diff-add'> var index = this.get_selected_index();</span>&nbsp; <span class='diff-add'> return this.get_cell(index);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Check whether a cell index is valid.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} index - A cell index</span>&nbsp; <span class='diff-add'> * @return True if the index is valid, false otherwise</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.is_valid_cell_index = function (index) {</span>&nbsp; <span class='diff-add'> if (index !== null && index >= 0 && index < this.ncells()) {</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get the index of the currently selected cell.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @return {integer} The selected cell's numeric index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.get_selected_index = function () {</span>&nbsp; <span class='diff-add'> var result = null;</span>&nbsp; <span class='diff-add'> this.get_cell_elements().filter(function (index) {</span>&nbsp; <span class='diff-add'> if ($(this).data("cell").selected === true) {</span>&nbsp; <span class='diff-add'> result = index;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Cell selection.</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Programmatically select a cell.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} index - A cell's index</span>&nbsp; <span class='diff-add'> * @return {Notebook} This notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.select = function (index) {</span>&nbsp; <span class='diff-add'> if (this.is_valid_cell_index(index)) {</span>&nbsp; <span class='diff-add'> var sindex = this.get_selected_index();</span>&nbsp; <span class='diff-add'> if (sindex !== null && index !== sindex) {</span>&nbsp; <span class='diff-add'> // If we are about to select a different cell, make sure we are</span>&nbsp; <span class='diff-add'> // first in command mode.</span>&nbsp; <span class='diff-add'> if (this.mode !== 'command') {</span>&nbsp; <span class='diff-add'> this.command_mode();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.get_cell(sindex).unselect();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(index);</span>&nbsp; <span class='diff-add'> cell.select();</span>&nbsp; <span class='diff-add'> if (cell.cell_type === 'heading') {</span>&nbsp; <span class='diff-add'> this.events.trigger('selected_cell_type_changed.Notebook',</span>&nbsp; <span class='diff-add'> {'cell_type':cell.cell_type,level:cell.level}</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.events.trigger('selected_cell_type_changed.Notebook',</span>&nbsp; <span class='diff-add'> {'cell_type':cell.cell_type}</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Programmatically select the next cell.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @return {Notebook} This notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.select_next = function () {</span>&nbsp; <span class='diff-add'> var index = this.get_selected_index();</span>&nbsp; <span class='diff-add'> this.select(index+1);</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Programmatically select the previous cell.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @return {Notebook} This notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.select_prev = function () {</span>&nbsp; <span class='diff-add'> var index = this.get_selected_index();</span>&nbsp; <span class='diff-add'> this.select(index-1);</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Edit/Command mode</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Gets the index of the cell that is in edit mode.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @return {integer} index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.get_edit_index = function () {</span>&nbsp; <span class='diff-add'> var result = null;</span>&nbsp; <span class='diff-add'> this.get_cell_elements().filter(function (index) {</span>&nbsp; <span class='diff-add'> if ($(this).data("cell").mode === 'edit') {</span>&nbsp; <span class='diff-add'> result = index;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return result;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle when a a cell blurs and the notebook should enter command mode.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param {Cell} [cell] - Cell to enter command mode on.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.handle_command_mode = function (cell) {</span>&nbsp; <span class='diff-add'> if (this.mode !== 'command') {</span>&nbsp; <span class='diff-add'> cell.command_mode();</span>&nbsp; <span class='diff-add'> this.mode = 'command';</span>&nbsp; <span class='diff-add'> this.events.trigger('command_mode.Notebook');</span>&nbsp; <span class='diff-add'> this.keyboard_manager.command_mode();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Make the notebook enter command mode.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.command_mode = function () {</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(this.get_edit_index());</span>&nbsp; <span class='diff-add'> if (cell && this.mode !== 'command') {</span>&nbsp; <span class='diff-add'> // We don't call cell.command_mode, but rather call cell.focus_cell()</span>&nbsp; <span class='diff-add'> // which will blur and CM editor and trigger the call to</span>&nbsp; <span class='diff-add'> // handle_command_mode.</span>&nbsp; <span class='diff-add'> cell.focus_cell();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle when a cell fires it's edit_mode event.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param {Cell} [cell] Cell to enter edit mode on.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.handle_edit_mode = function (cell) {</span>&nbsp; <span class='diff-add'> if (cell && this.mode !== 'edit') {</span>&nbsp; <span class='diff-add'> cell.edit_mode();</span>&nbsp; <span class='diff-add'> this.mode = 'edit';</span>&nbsp; <span class='diff-add'> this.events.trigger('edit_mode.Notebook');</span>&nbsp; <span class='diff-add'> this.keyboard_manager.edit_mode();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Make a cell enter edit mode.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.edit_mode = function () {</span>&nbsp; <span class='diff-add'> var cell = this.get_selected_cell();</span>&nbsp; <span class='diff-add'> if (cell && this.mode !== 'edit') {</span>&nbsp; <span class='diff-add'> cell.unrender();</span>&nbsp; <span class='diff-add'> cell.focus_editor();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Focus the currently selected cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.focus_cell = function () {</span>&nbsp; <span class='diff-add'> var cell = this.get_selected_cell();</span>&nbsp; <span class='diff-add'> if (cell === null) {return;} // No cell is selected</span>&nbsp; <span class='diff-add'> cell.focus_cell();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Cell movement</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Move given (or selected) cell up and select it.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} [index] - cell index</span>&nbsp; <span class='diff-add'> * @return {Notebook} This notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.move_cell_up = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> if (this.is_valid_cell_index(i) && i > 0) {</span>&nbsp; <span class='diff-add'> var pivot = this.get_cell_element(i-1);</span>&nbsp; <span class='diff-add'> var tomove = this.get_cell_element(i);</span>&nbsp; <span class='diff-add'> if (pivot !== null && tomove !== null) {</span>&nbsp; <span class='diff-add'> tomove.detach();</span>&nbsp; <span class='diff-add'> pivot.before(tomove);</span>&nbsp; <span class='diff-add'> this.select(i-1);</span>&nbsp; <span class='diff-add'> var cell = this.get_selected_cell();</span>&nbsp; <span class='diff-add'> cell.focus_cell();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Move given (or selected) cell down and select it.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} [index] - cell index</span>&nbsp; <span class='diff-add'> * @return {Notebook} This notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.move_cell_down = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> if (this.is_valid_cell_index(i) && this.is_valid_cell_index(i+1)) {</span>&nbsp; <span class='diff-add'> var pivot = this.get_cell_element(i+1);</span>&nbsp; <span class='diff-add'> var tomove = this.get_cell_element(i);</span>&nbsp; <span class='diff-add'> if (pivot !== null && tomove !== null) {</span>&nbsp; <span class='diff-add'> tomove.detach();</span>&nbsp; <span class='diff-add'> pivot.after(tomove);</span>&nbsp; <span class='diff-add'> this.select(i+1);</span>&nbsp; <span class='diff-add'> var cell = this.get_selected_cell();</span>&nbsp; <span class='diff-add'> cell.focus_cell();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.set_dirty();</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Insertion, deletion.</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Delete a cell from the notebook without any precautions</span>&nbsp; <span class='diff-add'> * Needed to reload checkpoints and other things like that.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} [index] - cell's numeric index</span>&nbsp; <span class='diff-add'> * @return {Notebook} This notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype._unsafe_delete_cell = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> $('#undelete_cell').addClass('disabled');</span>&nbsp; <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span>&nbsp; <span class='diff-add'> var old_ncells = this.ncells();</span>&nbsp; <span class='diff-add'> var ce = this.get_cell_element(i);</span>&nbsp; <span class='diff-add'> ce.remove();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Delete a cell from the notebook.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} [index] - cell's numeric index</span>&nbsp; <span class='diff-add'> * @return {Notebook} This notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.delete_cell = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> if (!cell.is_deletable()) {</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.undelete_backup = cell.toJSON();</span>&nbsp; <span class='diff-add'> $('#undelete_cell').removeClass('disabled');</span>&nbsp; <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span>&nbsp; <span class='diff-add'> var old_ncells = this.ncells();</span>&nbsp; <span class='diff-add'> var ce = this.get_cell_element(i);</span>&nbsp; <span class='diff-add'> ce.remove();</span>&nbsp; <span class='diff-add'> if (i === 0) {</span>&nbsp; <span class='diff-add'> // Always make sure we have at least one cell.</span>&nbsp; <span class='diff-add'> if (old_ncells === 1) {</span>&nbsp; <span class='diff-add'> this.insert_cell_below('code');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.select(0);</span>&nbsp; <span class='diff-add'> this.undelete_index = 0;</span>&nbsp; <span class='diff-add'> this.undelete_below = false;</span>&nbsp; <span class='diff-add'> } else if (i === old_ncells-1 && i !== 0) {</span>&nbsp; <span class='diff-add'> this.select(i-1);</span>&nbsp; <span class='diff-add'> this.undelete_index = i - 1;</span>&nbsp; <span class='diff-add'> this.undelete_below = true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.select(i);</span>&nbsp; <span class='diff-add'> this.undelete_index = i;</span>&nbsp; <span class='diff-add'> this.undelete_below = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.events.trigger('delete.Cell', {'cell': cell, 'index': i});</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Restore the most recently deleted cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.undelete_cell = function() {</span>&nbsp; <span class='diff-add'> if (this.undelete_backup !== null && this.undelete_index !== null) {</span>&nbsp; <span class='diff-add'> var current_index = this.get_selected_index();</span>&nbsp; <span class='diff-add'> if (this.undelete_index < current_index) {</span>&nbsp; <span class='diff-add'> current_index = current_index + 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.undelete_index >= this.ncells()) {</span>&nbsp; <span class='diff-add'> this.select(this.ncells() - 1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else {</span>&nbsp; <span class='diff-add'> this.select(this.undelete_index);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var cell_data = this.undelete_backup;</span>&nbsp; <span class='diff-add'> var new_cell = null;</span>&nbsp; <span class='diff-add'> if (this.undelete_below) {</span>&nbsp; <span class='diff-add'> new_cell = this.insert_cell_below(cell_data.cell_type);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> new_cell = this.insert_cell_above(cell_data.cell_type);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> new_cell.fromJSON(cell_data);</span>&nbsp; <span class='diff-add'> if (this.undelete_below) {</span>&nbsp; <span class='diff-add'> this.select(current_index+1);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.select(current_index);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.undelete_backup = null;</span>&nbsp; <span class='diff-add'> this.undelete_index = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> $('#undelete_cell').addClass('disabled');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Insert a cell so that after insertion the cell is at given index.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * If cell type is not provided, it will default to the type of the</span>&nbsp; <span class='diff-add'> * currently active cell.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Similar to insert_above, but index parameter is mandatory.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Index will be brought back into the accessible range [0,n].</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param {string} [type] - in ['code','markdown', 'raw'], defaults to 'code'</span>&nbsp; <span class='diff-add'> * @param {integer} [index] - a valid index where to insert cell</span>&nbsp; <span class='diff-add'> * @return {Cell|null} created cell or null</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.insert_cell_at_index = function(type, index){</span>&nbsp; <span class='diff-add'> var ncells = this.ncells();</span>&nbsp; <span class='diff-add'> index = Math.min(index, ncells);</span>&nbsp; <span class='diff-add'> index = Math.max(index, 0);</span>&nbsp; <span class='diff-add'> var cell = null;</span>&nbsp; <span class='diff-add'> type = type || this.class_config.get_sync('default_cell_type');</span>&nbsp; <span class='diff-add'> if (type === 'above') {</span>&nbsp; <span class='diff-add'> if (index > 0) {</span>&nbsp; <span class='diff-add'> type = this.get_cell(index-1).cell_type;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> type = 'code';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (type === 'below') {</span>&nbsp; <span class='diff-add'> if (index < ncells) {</span>&nbsp; <span class='diff-add'> type = this.get_cell(index).cell_type;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> type = 'code';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (type === 'selected') {</span>&nbsp; <span class='diff-add'> type = this.get_selected_cell().cell_type;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ncells === 0 || this.is_valid_cell_index(index) || index === ncells) {</span>&nbsp; <span class='diff-add'> var cell_options = {</span>&nbsp; <span class='diff-add'> events: this.events, </span>&nbsp; <span class='diff-add'> config: this.config, </span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager, </span>&nbsp; <span class='diff-add'> notebook: this,</span>&nbsp; <span class='diff-add'> tooltip: this.tooltip</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> switch(type) {</span>&nbsp; <span class='diff-add'> case 'code':</span>&nbsp; <span class='diff-add'> cell = new codecell.CodeCell(this.kernel, cell_options);</span>&nbsp; <span class='diff-add'> cell.set_input_prompt();</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'markdown':</span>&nbsp; <span class='diff-add'> cell = new textcell.MarkdownCell(cell_options);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'raw':</span>&nbsp; <span class='diff-add'> cell = new textcell.RawCell(cell_options);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> default:</span>&nbsp; <span class='diff-add'> console.log("Unrecognized cell type: ", type, cellmod);</span>&nbsp; <span class='diff-add'> cell = new cellmod.UnrecognizedCell(cell_options);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if(this._insert_element_at_index(cell.element,index)) {</span>&nbsp; <span class='diff-add'> cell.render();</span>&nbsp; <span class='diff-add'> this.events.trigger('create.Cell', {'cell': cell, 'index': index});</span>&nbsp; <span class='diff-add'> cell.refresh();</span>&nbsp; <span class='diff-add'> // We used to select the cell after we refresh it, but there</span>&nbsp; <span class='diff-add'> // are now cases were this method is called where select is</span>&nbsp; <span class='diff-add'> // not appropriate. The selection logic should be handled by the</span>&nbsp; <span class='diff-add'> // caller of the the top level insert_cell methods.</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cell;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Insert an element at given cell index.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param {HTMLElement} element - a cell element</span>&nbsp; <span class='diff-add'> * @param {integer} [index] - a valid index where to inser cell</span>&nbsp; <span class='diff-add'> * @returns {boolean} success</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype._insert_element_at_index = function(element, index){</span>&nbsp; <span class='diff-add'> if (element === undefined){</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var ncells = this.ncells();</span>&nbsp; <span class='diff-add'> if (ncells === 0) {</span>&nbsp; <span class='diff-add'> // special case append if empty</span>&nbsp; <span class='diff-add'> this.container.append(element);</span>&nbsp; <span class='diff-add'> } else if ( ncells === index ) {</span>&nbsp; <span class='diff-add'> // special case append it the end, but not empty</span>&nbsp; <span class='diff-add'> this.get_cell_element(index-1).after(element);</span>&nbsp; <span class='diff-add'> } else if (this.is_valid_cell_index(index)) {</span>&nbsp; <span class='diff-add'> // otherwise always somewhere to append to</span>&nbsp; <span class='diff-add'> this.get_cell_element(index).before(element);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.undelete_index !== null && index <= this.undelete_index) {</span>&nbsp; <span class='diff-add'> this.undelete_index = this.undelete_index + 1;</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Insert a cell of given type above given index, or at top</span>&nbsp; <span class='diff-add'> * of notebook if index smaller than 0.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param {string} [type] - cell type</span>&nbsp; <span class='diff-add'> * @param {integer} [index] - defaults to the currently selected cell</span>&nbsp; <span class='diff-add'> * @return {Cell|null} handle to created cell or null</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.insert_cell_above = function (type, index) {</span>&nbsp; <span class='diff-add'> index = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> return this.insert_cell_at_index(type, index);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Insert a cell of given type below given index, or at bottom</span>&nbsp; <span class='diff-add'> * of notebook if index greater than number of cells</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param {string} [type] - cell type</span>&nbsp; <span class='diff-add'> * @param {integer} [index] - defaults to the currently selected cell</span>&nbsp; <span class='diff-add'> * @return {Cell|null} handle to created cell or null</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.insert_cell_below = function (type, index) {</span>&nbsp; <span class='diff-add'> index = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> return this.insert_cell_at_index(type, index+1);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Insert cell at end of notebook</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param {string} type - cell type</span>&nbsp; <span class='diff-add'> * @return {Cell|null} handle to created cell or null</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.insert_cell_at_bottom = function (type){</span>&nbsp; <span class='diff-add'> var len = this.ncells();</span>&nbsp; <span class='diff-add'> return this.insert_cell_below(type,len-1);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Turn a cell into a code cell.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} [index] - cell index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.to_code = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span>&nbsp; <span class='diff-add'> var source_cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> if (!(source_cell instanceof codecell.CodeCell)) {</span>&nbsp; <span class='diff-add'> var target_cell = this.insert_cell_below('code',i);</span>&nbsp; <span class='diff-add'> var text = source_cell.get_text();</span>&nbsp; <span class='diff-add'> if (text === source_cell.placeholder) {</span>&nbsp; <span class='diff-add'> text = '';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //metadata</span>&nbsp; <span class='diff-add'> target_cell.metadata = source_cell.metadata;</span>&nbsp; <span class='diff-add'> target_cell.set_text(text);</span>&nbsp; <span class='diff-add'> // make this value the starting point, so that we can only undo</span>&nbsp; <span class='diff-add'> // to this state, instead of a blank cell</span>&nbsp; <span class='diff-add'> target_cell.code_mirror.clearHistory();</span>&nbsp; <span class='diff-add'> source_cell.element.remove();</span>&nbsp; <span class='diff-add'> this.select(i);</span>&nbsp; <span class='diff-add'> var cursor = source_cell.code_mirror.getCursor();</span>&nbsp; <span class='diff-add'> target_cell.code_mirror.setCursor(cursor);</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Turn a cell into a Markdown cell.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} [index] - cell index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.to_markdown = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span>&nbsp; <span class='diff-add'> var source_cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> if (!(source_cell instanceof textcell.MarkdownCell)) {</span>&nbsp; <span class='diff-add'> var target_cell = this.insert_cell_below('markdown',i);</span>&nbsp; <span class='diff-add'> var text = source_cell.get_text();</span>&nbsp; <span class='diff-add'> if (text === source_cell.placeholder) {</span>&nbsp; <span class='diff-add'> text = '';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // metadata</span>&nbsp; <span class='diff-add'> target_cell.metadata = source_cell.metadata;</span>&nbsp; <span class='diff-add'> // We must show the editor before setting its contents</span>&nbsp; <span class='diff-add'> target_cell.unrender();</span>&nbsp; <span class='diff-add'> target_cell.set_text(text);</span>&nbsp; <span class='diff-add'> // make this value the starting point, so that we can only undo</span>&nbsp; <span class='diff-add'> // to this state, instead of a blank cell</span>&nbsp; <span class='diff-add'> target_cell.code_mirror.clearHistory();</span>&nbsp; <span class='diff-add'> source_cell.element.remove();</span>&nbsp; <span class='diff-add'> this.select(i);</span>&nbsp; <span class='diff-add'> if ((source_cell instanceof textcell.TextCell) && source_cell.rendered) {</span>&nbsp; <span class='diff-add'> target_cell.render();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var cursor = source_cell.code_mirror.getCursor();</span>&nbsp; <span class='diff-add'> target_cell.code_mirror.setCursor(cursor);</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Turn a cell into a raw text cell.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} [index] - cell index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.to_raw = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span>&nbsp; <span class='diff-add'> var target_cell = null;</span>&nbsp; <span class='diff-add'> var source_cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> if (!(source_cell instanceof textcell.RawCell)) {</span>&nbsp; <span class='diff-add'> target_cell = this.insert_cell_below('raw',i);</span>&nbsp; <span class='diff-add'> var text = source_cell.get_text();</span>&nbsp; <span class='diff-add'> if (text === source_cell.placeholder) {</span>&nbsp; <span class='diff-add'> text = '';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //metadata</span>&nbsp; <span class='diff-add'> target_cell.metadata = source_cell.metadata;</span>&nbsp; <span class='diff-add'> // We must show the editor before setting its contents</span>&nbsp; <span class='diff-add'> target_cell.unrender();</span>&nbsp; <span class='diff-add'> target_cell.set_text(text);</span>&nbsp; <span class='diff-add'> // make this value the starting point, so that we can only undo</span>&nbsp; <span class='diff-add'> // to this state, instead of a blank cell</span>&nbsp; <span class='diff-add'> target_cell.code_mirror.clearHistory();</span>&nbsp; <span class='diff-add'> source_cell.element.remove();</span>&nbsp; <span class='diff-add'> this.select(i);</span>&nbsp; <span class='diff-add'> var cursor = source_cell.code_mirror.getCursor();</span>&nbsp; <span class='diff-add'> target_cell.code_mirror.setCursor(cursor);</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Warn about heading cell support removal.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype._warn_heading = function () {</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> notebook: this,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span>&nbsp; <span class='diff-add'> title : "Use markdown headings",</span>&nbsp; <span class='diff-add'> body : $("<p/>").text(</span>&nbsp; <span class='diff-add'> 'IPython no longer uses special heading cells. ' + </span>&nbsp; <span class='diff-add'> 'Instead, write your headings in Markdown cells using # characters:'</span>&nbsp; <span class='diff-add'> ).append($('<pre/>').text(</span>&nbsp; <span class='diff-add'> '## This is a level 2 heading'</span>&nbsp; <span class='diff-add'> )),</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> "OK" : {}</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Turn a cell into a heading containing markdown cell.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} [index] - cell index</span>&nbsp; <span class='diff-add'> * @param {integer} [level] - heading level (e.g., 1 for h1)</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.to_heading = function (index, level) {</span>&nbsp; <span class='diff-add'> this.to_markdown(index);</span>&nbsp; <span class='diff-add'> level = level || 1;</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> if (this.is_valid_cell_index(i)) {</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> cell.set_heading_level(level);</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Cut/Copy/Paste</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Enable the UI elements for pasting cells.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.enable_paste = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> if (!this.paste_enabled) {</span>&nbsp; <span class='diff-add'> $('#paste_cell_replace').removeClass('disabled')</span>&nbsp; <span class='diff-add'> .on('click', function () {that.paste_cell_replace();});</span>&nbsp; <span class='diff-add'> $('#paste_cell_above').removeClass('disabled')</span>&nbsp; <span class='diff-add'> .on('click', function () {that.paste_cell_above();});</span>&nbsp; <span class='diff-add'> $('#paste_cell_below').removeClass('disabled')</span>&nbsp; <span class='diff-add'> .on('click', function () {that.paste_cell_below();});</span>&nbsp; <span class='diff-add'> this.paste_enabled = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Disable the UI elements for pasting cells.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.disable_paste = function () {</span>&nbsp; <span class='diff-add'> if (this.paste_enabled) {</span>&nbsp; <span class='diff-add'> $('#paste_cell_replace').addClass('disabled').off('click');</span>&nbsp; <span class='diff-add'> $('#paste_cell_above').addClass('disabled').off('click');</span>&nbsp; <span class='diff-add'> $('#paste_cell_below').addClass('disabled').off('click');</span>&nbsp; <span class='diff-add'> this.paste_enabled = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Cut a cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.cut_cell = function () {</span>&nbsp; <span class='diff-add'> this.copy_cell();</span>&nbsp; <span class='diff-add'> this.delete_cell();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Copy a cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.copy_cell = function () {</span>&nbsp; <span class='diff-add'> var cell = this.get_selected_cell();</span>&nbsp; <span class='diff-add'> this.clipboard = cell.toJSON();</span>&nbsp; <span class='diff-add'> // remove undeletable status from the copied cell</span>&nbsp; <span class='diff-add'> if (this.clipboard.metadata.deletable !== undefined) {</span>&nbsp; <span class='diff-add'> delete this.clipboard.metadata.deletable;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.enable_paste();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Replace the selected cell with the cell in the clipboard.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.paste_cell_replace = function () {</span>&nbsp; <span class='diff-add'> if (this.clipboard !== null && this.paste_enabled) {</span>&nbsp; <span class='diff-add'> var cell_data = this.clipboard;</span>&nbsp; <span class='diff-add'> var new_cell = this.insert_cell_above(cell_data.cell_type);</span>&nbsp; <span class='diff-add'> new_cell.fromJSON(cell_data);</span>&nbsp; <span class='diff-add'> var old_cell = this.get_next_cell(new_cell);</span>&nbsp; <span class='diff-add'> this.delete_cell(this.find_cell_index(old_cell));</span>&nbsp; <span class='diff-add'> this.select(this.find_cell_index(new_cell));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Paste a cell from the clipboard above the selected cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.paste_cell_above = function () {</span>&nbsp; <span class='diff-add'> if (this.clipboard !== null && this.paste_enabled) {</span>&nbsp; <span class='diff-add'> var cell_data = this.clipboard;</span>&nbsp; <span class='diff-add'> var new_cell = this.insert_cell_above(cell_data.cell_type);</span>&nbsp; <span class='diff-add'> new_cell.fromJSON(cell_data);</span>&nbsp; <span class='diff-add'> new_cell.focus_cell();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Paste a cell from the clipboard below the selected cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.paste_cell_below = function () {</span>&nbsp; <span class='diff-add'> if (this.clipboard !== null && this.paste_enabled) {</span>&nbsp; <span class='diff-add'> var cell_data = this.clipboard;</span>&nbsp; <span class='diff-add'> var new_cell = this.insert_cell_below(cell_data.cell_type);</span>&nbsp; <span class='diff-add'> new_cell.fromJSON(cell_data);</span>&nbsp; <span class='diff-add'> new_cell.focus_cell();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Split/merge</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Split the selected cell into two cells.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.split_cell = function () {</span>&nbsp; <span class='diff-add'> var cell = this.get_selected_cell();</span>&nbsp; <span class='diff-add'> if (cell.is_splittable()) {</span>&nbsp; <span class='diff-add'> var texta = cell.get_pre_cursor();</span>&nbsp; <span class='diff-add'> var textb = cell.get_post_cursor();</span>&nbsp; <span class='diff-add'> cell.set_text(textb);</span>&nbsp; <span class='diff-add'> var new_cell = this.insert_cell_above(cell.cell_type);</span>&nbsp; <span class='diff-add'> // Unrender the new cell so we can call set_text.</span>&nbsp; <span class='diff-add'> new_cell.unrender();</span>&nbsp; <span class='diff-add'> new_cell.set_text(texta);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Merge the selected cell into the cell above it.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.merge_cell_above = function () {</span>&nbsp; <span class='diff-add'> var index = this.get_selected_index();</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(index);</span>&nbsp; <span class='diff-add'> var render = cell.rendered;</span>&nbsp; <span class='diff-add'> if (!cell.is_mergeable()) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (index > 0) {</span>&nbsp; <span class='diff-add'> var upper_cell = this.get_cell(index-1);</span>&nbsp; <span class='diff-add'> if (!upper_cell.is_mergeable()) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var upper_text = upper_cell.get_text();</span>&nbsp; <span class='diff-add'> var text = cell.get_text();</span>&nbsp; <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span>&nbsp; <span class='diff-add'> cell.set_text(upper_text+'\n'+text);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> cell.unrender(); // Must unrender before we set_text.</span>&nbsp; <span class='diff-add'> cell.set_text(upper_text+'\n\n'+text);</span>&nbsp; <span class='diff-add'> if (render) {</span>&nbsp; <span class='diff-add'> // The rendered state of the final cell should match</span>&nbsp; <span class='diff-add'> // that of the original selected cell;</span>&nbsp; <span class='diff-add'> cell.render();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.delete_cell(index-1);</span>&nbsp; <span class='diff-add'> this.select(this.find_cell_index(cell));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Merge the selected cell into the cell below it.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.merge_cell_below = function () {</span>&nbsp; <span class='diff-add'> var index = this.get_selected_index();</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(index);</span>&nbsp; <span class='diff-add'> var render = cell.rendered;</span>&nbsp; <span class='diff-add'> if (!cell.is_mergeable()) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (index < this.ncells()-1) {</span>&nbsp; <span class='diff-add'> var lower_cell = this.get_cell(index+1);</span>&nbsp; <span class='diff-add'> if (!lower_cell.is_mergeable()) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lower_text = lower_cell.get_text();</span>&nbsp; <span class='diff-add'> var text = cell.get_text();</span>&nbsp; <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span>&nbsp; <span class='diff-add'> cell.set_text(text+'\n'+lower_text);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> cell.unrender(); // Must unrender before we set_text.</span>&nbsp; <span class='diff-add'> cell.set_text(text+'\n\n'+lower_text);</span>&nbsp; <span class='diff-add'> if (render) {</span>&nbsp; <span class='diff-add'> // The rendered state of the final cell should match</span>&nbsp; <span class='diff-add'> // that of the original selected cell;</span>&nbsp; <span class='diff-add'> cell.render();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.delete_cell(index+1);</span>&nbsp; <span class='diff-add'> this.select(this.find_cell_index(cell));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Cell collapsing and output clearing</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Hide a cell's output.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} index - cell index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.collapse_output = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span>&nbsp; <span class='diff-add'> cell.collapse_output();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Hide each code cell's output area.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.collapse_all_output = function () {</span>&nbsp; <span class='diff-add'> this.get_cells().map(function (cell, i) {</span>&nbsp; <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span>&nbsp; <span class='diff-add'> cell.collapse_output();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // this should not be set if the `collapse` key is removed from nbformat</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Show a cell's output.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} index - cell index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.expand_output = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span>&nbsp; <span class='diff-add'> cell.expand_output();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Expand each code cell's output area, and remove scrollbars.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.expand_all_output = function () {</span>&nbsp; <span class='diff-add'> this.get_cells().map(function (cell, i) {</span>&nbsp; <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span>&nbsp; <span class='diff-add'> cell.expand_output();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // this should not be set if the `collapse` key is removed from nbformat</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Clear the selected CodeCell's output area.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} index - cell index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.clear_output = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span>&nbsp; <span class='diff-add'> cell.clear_output();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Clear each code cell's output area.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.clear_all_output = function () {</span>&nbsp; <span class='diff-add'> this.get_cells().map(function (cell, i) {</span>&nbsp; <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span>&nbsp; <span class='diff-add'> cell.clear_output();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Scroll the selected CodeCell's output area.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} index - cell index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.scroll_output = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span>&nbsp; <span class='diff-add'> cell.scroll_output();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Expand each code cell's output area and add a scrollbar for long output.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.scroll_all_output = function () {</span>&nbsp; <span class='diff-add'> this.get_cells().map(function (cell, i) {</span>&nbsp; <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span>&nbsp; <span class='diff-add'> cell.scroll_output();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // this should not be set if the `collapse` key is removed from nbformat</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** </span>&nbsp; <span class='diff-add'> * Toggle whether a cell's output is collapsed or expanded.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} index - cell index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.toggle_output = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span>&nbsp; <span class='diff-add'> cell.toggle_output();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Toggle the output of all cells.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.toggle_all_output = function () {</span>&nbsp; <span class='diff-add'> this.get_cells().map(function (cell, i) {</span>&nbsp; <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span>&nbsp; <span class='diff-add'> cell.toggle_output();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // this should not be set if the `collapse` key is removed from nbformat</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Toggle a scrollbar for long cell outputs.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} index - cell index</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.toggle_output_scroll = function (index) {</span>&nbsp; <span class='diff-add'> var i = this.index_or_selected(index);</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> if (cell !== null && (cell instanceof codecell.CodeCell)) {</span>&nbsp; <span class='diff-add'> cell.toggle_output_scroll();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Toggle the scrolling of long output on all cells.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.toggle_all_output_scroll = function () {</span>&nbsp; <span class='diff-add'> this.get_cells().map(function (cell, i) {</span>&nbsp; <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span>&nbsp; <span class='diff-add'> cell.toggle_output_scroll();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // this should not be set if the `collapse` key is removed from nbformat</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Other cell functions: line numbers, ...</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Toggle line numbers in the selected cell's input area.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.cell_toggle_line_numbers = function() {</span>&nbsp; <span class='diff-add'> this.get_selected_cell().toggle_line_numbers();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set the codemirror mode for all code cells, including the default for</span>&nbsp; <span class='diff-add'> * new code cells.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.set_codemirror_mode = function(newmode){</span>&nbsp; <span class='diff-add'> if (newmode === this.codemirror_mode) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.codemirror_mode = newmode;</span>&nbsp; <span class='diff-add'> codecell.CodeCell.options_default.cm_config.mode = newmode;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> utils.requireCodeMirrorMode(newmode, function (spec) {</span>&nbsp; <span class='diff-add'> that.get_cells().map(function(cell, i) {</span>&nbsp; <span class='diff-add'> if (cell.cell_type === 'code'){</span>&nbsp; <span class='diff-add'> cell.code_mirror.setOption('mode', spec);</span>&nbsp; <span class='diff-add'> // This is currently redundant, because cm_config ends up as</span>&nbsp; <span class='diff-add'> // codemirror's own .options object, but I don't want to</span>&nbsp; <span class='diff-add'> // rely on that.</span>&nbsp; <span class='diff-add'> cell.cm_config.mode = spec;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Session related things</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Start a new session and set it on each code cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.start_session = function (kernel_name) {</span>&nbsp; <span class='diff-add'> if (this._session_starting) {</span>&nbsp; <span class='diff-add'> throw new session.SessionAlreadyStarting();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._session_starting = true;</span>&nbsp; <span class='diff-add'> var options = {</span>&nbsp; <span class='diff-add'> base_url: this.base_url,</span>&nbsp; <span class='diff-add'> ws_url: this.ws_url,</span>&nbsp; <span class='diff-add'> notebook_path: this.notebook_path,</span>&nbsp; <span class='diff-add'> notebook_name: this.notebook_name,</span>&nbsp; <span class='diff-add'> kernel_name: kernel_name,</span>&nbsp; <span class='diff-add'> notebook: this</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var success = $.proxy(this._session_started, this);</span>&nbsp; <span class='diff-add'> var failure = $.proxy(this._session_start_failed, this);</span>&nbsp; <span class='diff-add'> if (this.session !== null) {</span>&nbsp; <span class='diff-add'> this.session.restart(options, success, failure);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.session = new session.Session(options);</span>&nbsp; <span class='diff-add'> this.session.start(success, failure);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Once a session is started, link the code cells to the kernel and pass the </span>&nbsp; <span class='diff-add'> * comm manager to the widget manager.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype._session_started = function (){</span>&nbsp; <span class='diff-add'> this._session_starting = false;</span>&nbsp; <span class='diff-add'> this.kernel = this.session.kernel;</span>&nbsp; <span class='diff-add'> var ncells = this.ncells();</span>&nbsp; <span class='diff-add'> for (var i=0; i<ncells; i++) {</span>&nbsp; <span class='diff-add'> var cell = this.get_cell(i);</span>&nbsp; <span class='diff-add'> if (cell instanceof codecell.CodeCell) {</span>&nbsp; <span class='diff-add'> cell.set_kernel(this.session.kernel);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when the session fails to start.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype._session_start_failed = function(jqxhr, status, error){</span>&nbsp; <span class='diff-add'> this._session_starting = false;</span>&nbsp; <span class='diff-add'> utils.log_ajax_error(jqxhr, status, error);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Prompt the user to restart the IPython kernel.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.restart_kernel = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> notebook: this,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span>&nbsp; <span class='diff-add'> title : "Restart kernel or continue running?",</span>&nbsp; <span class='diff-add'> body : $("<p/>").text(</span>&nbsp; <span class='diff-add'> 'Do you want to restart the current kernel? You will lose all variables defined in it.'</span>&nbsp; <span class='diff-add'> ),</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> "Continue running" : {},</span>&nbsp; <span class='diff-add'> "Restart" : {</span>&nbsp; <span class='diff-add'> "class" : "btn-danger",</span>&nbsp; <span class='diff-add'> "click" : function() {</span>&nbsp; <span class='diff-add'> that.kernel.restart();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Execute or render cell outputs and go into command mode.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.execute_cell = function () {</span>&nbsp; <span class='diff-add'> // mode = shift, ctrl, alt</span>&nbsp; <span class='diff-add'> var cell = this.get_selected_cell();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> cell.execute();</span>&nbsp; <span class='diff-add'> this.command_mode();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Execute or render cell outputs and insert a new cell below.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.execute_cell_and_insert_below = function () {</span>&nbsp; <span class='diff-add'> var cell = this.get_selected_cell();</span>&nbsp; <span class='diff-add'> var cell_index = this.find_cell_index(cell);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> cell.execute();</span>&nbsp; <span class='diff-add'> // If we are at the end always insert a new cell and return</span>&nbsp; <span class='diff-add'> if (cell_index === (this.ncells()-1)) {</span>&nbsp; <span class='diff-add'> this.command_mode();</span>&nbsp; <span class='diff-add'> this.insert_cell_below();</span>&nbsp; <span class='diff-add'> this.select(cell_index+1);</span>&nbsp; <span class='diff-add'> this.edit_mode();</span>&nbsp; <span class='diff-add'> this.scroll_to_bottom();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.command_mode();</span>&nbsp; <span class='diff-add'> this.insert_cell_below();</span>&nbsp; <span class='diff-add'> this.select(cell_index+1);</span>&nbsp; <span class='diff-add'> this.edit_mode();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Execute or render cell outputs and select the next cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.execute_cell_and_select_below = function () {</span>&nbsp; <span class='diff-add'> var cell = this.get_selected_cell();</span>&nbsp; <span class='diff-add'> var cell_index = this.find_cell_index(cell);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> cell.execute();</span>&nbsp; <span class='diff-add'> // If we are at the end always insert a new cell and return</span>&nbsp; <span class='diff-add'> if (cell_index === (this.ncells()-1)) {</span>&nbsp; <span class='diff-add'> this.command_mode();</span>&nbsp; <span class='diff-add'> this.insert_cell_below();</span>&nbsp; <span class='diff-add'> this.select(cell_index+1);</span>&nbsp; <span class='diff-add'> this.edit_mode();</span>&nbsp; <span class='diff-add'> this.scroll_to_bottom();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.command_mode();</span>&nbsp; <span class='diff-add'> this.select(cell_index+1);</span>&nbsp; <span class='diff-add'> this.focus_cell();</span>&nbsp; <span class='diff-add'> this.set_dirty(true);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Execute all cells below the selected cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.execute_cells_below = function () {</span>&nbsp; <span class='diff-add'> this.execute_cell_range(this.get_selected_index(), this.ncells());</span>&nbsp; <span class='diff-add'> this.scroll_to_bottom();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Execute all cells above the selected cell.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.execute_cells_above = function () {</span>&nbsp; <span class='diff-add'> this.execute_cell_range(0, this.get_selected_index());</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Execute all cells.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.execute_all_cells = function () {</span>&nbsp; <span class='diff-add'> this.execute_cell_range(0, this.ncells());</span>&nbsp; <span class='diff-add'> this.scroll_to_bottom();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Execute a contiguous range of cells.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} start - index of the first cell to execute (inclusive)</span>&nbsp; <span class='diff-add'> * @param {integer} end - index of the last cell to execute (exclusive)</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.execute_cell_range = function (start, end) {</span>&nbsp; <span class='diff-add'> this.command_mode();</span>&nbsp; <span class='diff-add'> for (var i=start; i<end; i++) {</span>&nbsp; <span class='diff-add'> this.select(i);</span>&nbsp; <span class='diff-add'> this.execute_cell();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Persistance and loading</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Getter method for this notebook's name.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @return {string} This notebook's name (excluding file extension)</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.get_notebook_name = function () {</span>&nbsp; <span class='diff-add'> var nbname = this.notebook_name.substring(0,this.notebook_name.length-6);</span>&nbsp; <span class='diff-add'> return nbname;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Setter method for this notebook's name.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param {string} name</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.set_notebook_name = function (name) {</span>&nbsp; <span class='diff-add'> var parent = utils.url_path_split(this.notebook_path)[0];</span>&nbsp; <span class='diff-add'> this.notebook_name = name;</span>&nbsp; <span class='diff-add'> this.notebook_path = utils.url_path_join(parent, name);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Check that a notebook's name is valid.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {string} nbname - A name for this notebook</span>&nbsp; <span class='diff-add'> * @return {boolean} True if the name is valid, false if invalid</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.test_notebook_name = function (nbname) {</span>&nbsp; <span class='diff-add'> nbname = nbname || '';</span>&nbsp; <span class='diff-add'> if (nbname.length>0 && !this.notebook_name_blacklist_re.test(nbname)) {</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Load a notebook from JSON (.ipynb).</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {object} data - JSON representation of a notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.fromJSON = function (data) {</span>&nbsp; <span class='diff-add'> var content = data.content;</span>&nbsp; <span class='diff-add'> var ncells = this.ncells();</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> for (i=0; i<ncells; i++) {</span>&nbsp; <span class='diff-add'> // Always delete cell 0 as they get renumbered as they are deleted.</span>&nbsp; <span class='diff-add'> this._unsafe_delete_cell(0);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Save the metadata and name.</span>&nbsp; <span class='diff-add'> this.metadata = content.metadata;</span>&nbsp; <span class='diff-add'> this.notebook_name = data.name;</span>&nbsp; <span class='diff-add'> this.notebook_path = data.path;</span>&nbsp; <span class='diff-add'> var trusted = true;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Set the codemirror mode from language_info metadata</span>&nbsp; <span class='diff-add'> if (this.metadata.language_info !== undefined) {</span>&nbsp; <span class='diff-add'> var langinfo = this.metadata.language_info;</span>&nbsp; <span class='diff-add'> // Mode 'null' should be plain, unhighlighted text.</span>&nbsp; <span class='diff-add'> var cm_mode = langinfo.codemirror_mode || langinfo.name || 'null';</span>&nbsp; <span class='diff-add'> this.set_codemirror_mode(cm_mode);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var new_cells = content.cells;</span>&nbsp; <span class='diff-add'> ncells = new_cells.length;</span>&nbsp; <span class='diff-add'> var cell_data = null;</span>&nbsp; <span class='diff-add'> var new_cell = null;</span>&nbsp; <span class='diff-add'> for (i=0; i<ncells; i++) {</span>&nbsp; <span class='diff-add'> cell_data = new_cells[i];</span>&nbsp; <span class='diff-add'> new_cell = this.insert_cell_at_index(cell_data.cell_type, i);</span>&nbsp; <span class='diff-add'> new_cell.fromJSON(cell_data);</span>&nbsp; <span class='diff-add'> if (new_cell.cell_type === 'code' && !new_cell.output_area.trusted) {</span>&nbsp; <span class='diff-add'> trusted = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (trusted !== this.trusted) {</span>&nbsp; <span class='diff-add'> this.trusted = trusted;</span>&nbsp; <span class='diff-add'> this.events.trigger("trust_changed.Notebook", trusted);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Dump this notebook into a JSON-friendly object.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @return {object} A JSON-friendly representation of this notebook.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.toJSON = function () {</span>&nbsp; <span class='diff-add'> // remove the conversion indicator, which only belongs in-memory</span>&nbsp; <span class='diff-add'> delete this.metadata.orig_nbformat;</span>&nbsp; <span class='diff-add'> delete this.metadata.orig_nbformat_minor;</span>&nbsp; <span class='diff-add'> var cells = this.get_cells();</span>&nbsp; <span class='diff-add'> var ncells = cells.length;</span>&nbsp; <span class='diff-add'> var cell_array = new Array(ncells);</span>&nbsp; <span class='diff-add'> var trusted = true;</span>&nbsp; <span class='diff-add'> for (var i=0; i<ncells; i++) {</span>&nbsp; <span class='diff-add'> var cell = cells[i];</span>&nbsp; <span class='diff-add'> if (cell.cell_type === 'code' && !cell.output_area.trusted) {</span>&nbsp; <span class='diff-add'> trusted = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cell_array[i] = cell.toJSON();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var data = {</span>&nbsp; <span class='diff-add'> cells: cell_array,</span>&nbsp; <span class='diff-add'> metadata: this.metadata,</span>&nbsp; <span class='diff-add'> nbformat: this.nbformat,</span>&nbsp; <span class='diff-add'> nbformat_minor: this.nbformat_minor</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (trusted !== this.trusted) {</span>&nbsp; <span class='diff-add'> this.trusted = trusted;</span>&nbsp; <span class='diff-add'> this.events.trigger("trust_changed.Notebook", trusted);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return data;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Start an autosave timer which periodically saves the notebook.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} interval - the autosave interval in milliseconds</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.set_autosave_interval = function (interval) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> // clear previous interval, so we don't get simultaneous timers</span>&nbsp; <span class='diff-add'> if (this.autosave_timer) {</span>&nbsp; <span class='diff-add'> clearInterval(this.autosave_timer);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!this.writable) {</span>&nbsp; <span class='diff-add'> // disable autosave if not writable</span>&nbsp; <span class='diff-add'> interval = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.autosave_interval = this.minimum_autosave_interval = interval;</span>&nbsp; <span class='diff-add'> if (interval) {</span>&nbsp; <span class='diff-add'> this.autosave_timer = setInterval(function() {</span>&nbsp; <span class='diff-add'> if (that.dirty) {</span>&nbsp; <span class='diff-add'> that.save_notebook();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, interval);</span>&nbsp; <span class='diff-add'> this.events.trigger("autosave_enabled.Notebook", interval);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.autosave_timer = null;</span>&nbsp; <span class='diff-add'> this.events.trigger("autosave_disabled.Notebook");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Save this notebook on the server. This becomes a notebook instance's</span>&nbsp; <span class='diff-add'> * .save_notebook method *after* the entire notebook has been loaded.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.save_notebook = function (check_last_modified) {</span>&nbsp; <span class='diff-add'> if (check_last_modified === undefined) {</span>&nbsp; <span class='diff-add'> check_last_modified = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!this._fully_loaded) {</span>&nbsp; <span class='diff-add'> this.events.trigger('notebook_save_failed.Notebook',</span>&nbsp; <span class='diff-add'> new Error("Load failed, save is disabled")</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> } else if (!this.writable) {</span>&nbsp; <span class='diff-add'> this.events.trigger('notebook_save_failed.Notebook',</span>&nbsp; <span class='diff-add'> new Error("Notebook is read-only")</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Trigger an event before save, which allows listeners to modify</span>&nbsp; <span class='diff-add'> // the notebook as needed.</span>&nbsp; <span class='diff-add'> this.events.trigger('before_save.Notebook');</span>&nbsp; <span class='diff-add'> // Create a JSON model to be sent to the server.</span>&nbsp; <span class='diff-add'> var model = {</span>&nbsp; <span class='diff-add'> type : "notebook",</span>&nbsp; <span class='diff-add'> content : this.toJSON()</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // time the ajax call for autosave tuning purposes.</span>&nbsp; <span class='diff-add'> var start = new Date().getTime();</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var _save = function () {</span>&nbsp; <span class='diff-add'> return that.contents.save(that.notebook_path, model).then(</span>&nbsp; <span class='diff-add'> $.proxy(that.save_notebook_success, that, start),</span>&nbsp; <span class='diff-add'> function (error) {</span>&nbsp; <span class='diff-add'> that.events.trigger('notebook_save_failed.Notebook', error);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (check_last_modified) {</span>&nbsp; <span class='diff-add'> return this.contents.get(this.notebook_path, {content: false}).then(</span>&nbsp; <span class='diff-add'> function (data) {</span>&nbsp; <span class='diff-add'> var last_modified = new Date(data.last_modified);</span>&nbsp; <span class='diff-add'> if (last_modified > that.last_modified) {</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> notebook: that,</span>&nbsp; <span class='diff-add'> keyboard_manager: that.keyboard_manager,</span>&nbsp; <span class='diff-add'> title: "Notebook changed",</span>&nbsp; <span class='diff-add'> body: "Notebook has changed since we opened it. Overwrite the changed file?",</span>&nbsp; <span class='diff-add'> buttons: {</span>&nbsp; <span class='diff-add'> Cancel: {},</span>&nbsp; <span class='diff-add'> Overwrite: {</span>&nbsp; <span class='diff-add'> class: 'btn-danger',</span>&nbsp; <span class='diff-add'> click: function () {</span>&nbsp; <span class='diff-add'> _save();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return _save();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, function (error) {</span>&nbsp; <span class='diff-add'> // maybe it has been deleted or renamed? Go ahead and save.</span>&nbsp; <span class='diff-add'> return _save();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return _save();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Success callback for saving a notebook.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} start - Time when the save request start</span>&nbsp; <span class='diff-add'> * @param {object} data - JSON representation of a notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.save_notebook_success = function (start, data) {</span>&nbsp; <span class='diff-add'> this.set_dirty(false);</span>&nbsp; <span class='diff-add'> this.last_modified = new Date(data.last_modified);</span>&nbsp; <span class='diff-add'> if (data.message) {</span>&nbsp; <span class='diff-add'> // save succeeded, but validation failed.</span>&nbsp; <span class='diff-add'> var body = $("<div>");</span>&nbsp; <span class='diff-add'> var title = "Notebook validation failed";</span>&nbsp; <span class='diff-add'> body.append($("<p>").text(</span>&nbsp; <span class='diff-add'> "The save operation succeeded," +</span>&nbsp; <span class='diff-add'> " but the notebook does not appear to be valid." +</span>&nbsp; <span class='diff-add'> " The validation error was:"</span>&nbsp; <span class='diff-add'> )).append($("<div>").addClass("validation-error").append(</span>&nbsp; <span class='diff-add'> $("<pre>").text(data.message)</span>&nbsp; <span class='diff-add'> ));</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> notebook: this,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span>&nbsp; <span class='diff-add'> title: title,</span>&nbsp; <span class='diff-add'> body: body,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> OK : {</span>&nbsp; <span class='diff-add'> "class" : "btn-primary"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.events.trigger('notebook_saved.Notebook');</span>&nbsp; <span class='diff-add'> this._update_autosave_interval(start);</span>&nbsp; <span class='diff-add'> if (this._checkpoint_after_save) {</span>&nbsp; <span class='diff-add'> this.create_checkpoint();</span>&nbsp; <span class='diff-add'> this._checkpoint_after_save = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the autosave interval based on the duration of the last save.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {integer} timestamp - when the save request started</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype._update_autosave_interval = function (start) {</span>&nbsp; <span class='diff-add'> var duration = (new Date().getTime() - start);</span>&nbsp; <span class='diff-add'> if (this.autosave_interval) {</span>&nbsp; <span class='diff-add'> // new save interval: higher of 10x save duration or parameter (default 30 seconds)</span>&nbsp; <span class='diff-add'> var interval = Math.max(10 * duration, this.minimum_autosave_interval);</span>&nbsp; <span class='diff-add'> // round to 10 seconds, otherwise we will be setting a new interval too often</span>&nbsp; <span class='diff-add'> interval = 10000 * Math.round(interval / 10000);</span>&nbsp; <span class='diff-add'> // set new interval, if it's changed</span>&nbsp; <span class='diff-add'> if (interval !== this.autosave_interval) {</span>&nbsp; <span class='diff-add'> this.set_autosave_interval(interval);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Explicitly trust the output of this notebook.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.trust_notebook = function () {</span>&nbsp; <span class='diff-add'> var body = $("<div>").append($("<p>")</span>&nbsp; <span class='diff-add'> .text("A trusted IPython notebook may execute hidden malicious code ")</span>&nbsp; <span class='diff-add'> .append($("<strong>")</span>&nbsp; <span class='diff-add'> .append(</span>&nbsp; <span class='diff-add'> $("<em>").text("when you open it")</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> ).append(".").append(</span>&nbsp; <span class='diff-add'> " Selecting trust will immediately reload this notebook in a trusted state."</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> " For more information, see the "</span>&nbsp; <span class='diff-add'> ).append($("<a>").attr("href", "http://ipython.org/ipython-doc/2/notebook/security.html")</span>&nbsp; <span class='diff-add'> .text("IPython security documentation")</span>&nbsp; <span class='diff-add'> ).append(".")</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> var nb = this;</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> notebook: this,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span>&nbsp; <span class='diff-add'> title: "Trust this notebook?",</span>&nbsp; <span class='diff-add'> body: body,</span>&nbsp; <span class='diff-add'> buttons: {</span>&nbsp; <span class='diff-add'> Cancel : {},</span>&nbsp; <span class='diff-add'> Trust : {</span>&nbsp; <span class='diff-add'> class : "btn-danger",</span>&nbsp; <span class='diff-add'> click : function () {</span>&nbsp; <span class='diff-add'> var cells = nb.get_cells();</span>&nbsp; <span class='diff-add'> for (var i = 0; i < cells.length; i++) {</span>&nbsp; <span class='diff-add'> var cell = cells[i];</span>&nbsp; <span class='diff-add'> if (cell.cell_type === 'code') {</span>&nbsp; <span class='diff-add'> cell.output_area.trusted = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> nb.events.on('notebook_saved.Notebook', function () {</span>&nbsp; <span class='diff-add'> window.location.reload();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> nb.save_notebook();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Make a copy of the current notebook.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.copy_notebook = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var base_url = this.base_url;</span>&nbsp; <span class='diff-add'> var w = window.open(undefined, IPython._target);</span>&nbsp; <span class='diff-add'> var parent = utils.url_path_split(this.notebook_path)[0];</span>&nbsp; <span class='diff-add'> this.contents.copy(this.notebook_path, parent).then(</span>&nbsp; <span class='diff-add'> function (data) {</span>&nbsp; <span class='diff-add'> w.location = utils.url_join_encode(</span>&nbsp; <span class='diff-add'> base_url, 'notebooks', data.path</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> function(error) {</span>&nbsp; <span class='diff-add'> w.close();</span>&nbsp; <span class='diff-add'> that.events.trigger('notebook_copy_failed', error);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Ensure a filename has the right extension</span>&nbsp; <span class='diff-add'> * Returns the filename with the appropriate extension, appending if necessary.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.ensure_extension = function (name) {</span>&nbsp; <span class='diff-add'> if (!name.match(/\.ipynb$/)) {</span>&nbsp; <span class='diff-add'> name = name + ".ipynb";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return name;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Rename the notebook.</span>&nbsp; <span class='diff-add'> * @param {string} new_name</span>&nbsp; <span class='diff-add'> * @return {Promise} promise that resolves when the notebook is renamed.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.rename = function (new_name) {</span>&nbsp; <span class='diff-add'> new_name = this.ensure_extension(new_name);</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var parent = utils.url_path_split(this.notebook_path)[0];</span>&nbsp; <span class='diff-add'> var new_path = utils.url_path_join(parent, new_name);</span>&nbsp; <span class='diff-add'> return this.contents.rename(this.notebook_path, new_path).then(</span>&nbsp; <span class='diff-add'> function (json) {</span>&nbsp; <span class='diff-add'> that.notebook_name = json.name;</span>&nbsp; <span class='diff-add'> that.notebook_path = json.path;</span>&nbsp; <span class='diff-add'> that.session.rename_notebook(json.path);</span>&nbsp; <span class='diff-add'> that.events.trigger('notebook_renamed.Notebook', json);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Delete this notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.delete = function () {</span>&nbsp; <span class='diff-add'> this.contents.delete(this.notebook_path);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Request a notebook's data from the server.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {string} notebook_path - A notebook to load</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.load_notebook = function (notebook_path) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.notebook_path = notebook_path;</span>&nbsp; <span class='diff-add'> this.notebook_name = utils.url_path_split(this.notebook_path)[1];</span>&nbsp; <span class='diff-add'> this.events.trigger('notebook_loading.Notebook');</span>&nbsp; <span class='diff-add'> this.contents.get(notebook_path, {type: 'notebook'}).then(</span>&nbsp; <span class='diff-add'> $.proxy(this.load_notebook_success, this),</span>&nbsp; <span class='diff-add'> $.proxy(this.load_notebook_error, this)</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Success callback for loading a notebook from the server.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * Load notebook data from the JSON response.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {object} data JSON representation of a notebook</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.load_notebook_success = function (data) {</span>&nbsp; <span class='diff-add'> var failed, msg;</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> this.fromJSON(data);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> failed = e;</span>&nbsp; <span class='diff-add'> console.log("Notebook failed to load from JSON:", e);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (failed || data.message) {</span>&nbsp; <span class='diff-add'> // *either* fromJSON failed or validation failed</span>&nbsp; <span class='diff-add'> var body = $("<div>");</span>&nbsp; <span class='diff-add'> var title;</span>&nbsp; <span class='diff-add'> if (failed) {</span>&nbsp; <span class='diff-add'> title = "Notebook failed to load";</span>&nbsp; <span class='diff-add'> body.append($("<p>").text(</span>&nbsp; <span class='diff-add'> "The error was: "</span>&nbsp; <span class='diff-add'> )).append($("<div>").addClass("js-error").text(</span>&nbsp; <span class='diff-add'> failed.toString()</span>&nbsp; <span class='diff-add'> )).append($("<p>").text(</span>&nbsp; <span class='diff-add'> "See the error console for details."</span>&nbsp; <span class='diff-add'> ));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> title = "Notebook validation failed";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (data.message) {</span>&nbsp; <span class='diff-add'> if (failed) {</span>&nbsp; <span class='diff-add'> msg = "The notebook also failed validation:";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> msg = "An invalid notebook may not function properly." +</span>&nbsp; <span class='diff-add'> " The validation error was:";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> body.append($("<p>").text(</span>&nbsp; <span class='diff-add'> msg</span>&nbsp; <span class='diff-add'> )).append($("<div>").addClass("validation-error").append(</span>&nbsp; <span class='diff-add'> $("<pre>").text(data.message)</span>&nbsp; <span class='diff-add'> ));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> notebook: this,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span>&nbsp; <span class='diff-add'> title: title,</span>&nbsp; <span class='diff-add'> body: body,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> OK : {</span>&nbsp; <span class='diff-add'> "class" : "btn-primary"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.ncells() === 0) {</span>&nbsp; <span class='diff-add'> this.insert_cell_below('code');</span>&nbsp; <span class='diff-add'> this.edit_mode(0);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.select(0);</span>&nbsp; <span class='diff-add'> this.handle_command_mode(this.get_cell(0));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.set_dirty(false);</span>&nbsp; <span class='diff-add'> this.scroll_to_top();</span>&nbsp; <span class='diff-add'> this.writable = data.writable || false;</span>&nbsp; <span class='diff-add'> this.last_modified = new Date(data.last_modified);</span>&nbsp; <span class='diff-add'> var nbmodel = data.content;</span>&nbsp; <span class='diff-add'> var orig_nbformat = nbmodel.metadata.orig_nbformat;</span>&nbsp; <span class='diff-add'> var orig_nbformat_minor = nbmodel.metadata.orig_nbformat_minor;</span>&nbsp; <span class='diff-add'> if (orig_nbformat !== undefined && nbmodel.nbformat !== orig_nbformat) {</span>&nbsp; <span class='diff-add'> var src;</span>&nbsp; <span class='diff-add'> if (nbmodel.nbformat > orig_nbformat) {</span>&nbsp; <span class='diff-add'> src = " an older notebook format ";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> src = " a newer notebook format ";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> msg = "This notebook has been converted from" + src +</span>&nbsp; <span class='diff-add'> "(v"+orig_nbformat+") to the current notebook " +</span>&nbsp; <span class='diff-add'> "format (v"+nbmodel.nbformat+"). The next time you save this notebook, the " +</span>&nbsp; <span class='diff-add'> "current notebook format will be used.";</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (nbmodel.nbformat > orig_nbformat) {</span>&nbsp; <span class='diff-add'> msg += " Older versions of IPython may not be able to read the new format.";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> msg += " Some features of the original notebook may not be available.";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> msg += " To preserve the original version, close the " +</span>&nbsp; <span class='diff-add'> "notebook without saving it.";</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> notebook: this,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span>&nbsp; <span class='diff-add'> title : "Notebook converted",</span>&nbsp; <span class='diff-add'> body : msg,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> OK : {</span>&nbsp; <span class='diff-add'> class : "btn-primary"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> } else if (this.nbformat_minor < nbmodel.nbformat_minor) {</span>&nbsp; <span class='diff-add'> this.nbformat_minor = nbmodel.nbformat_minor;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.session === null) {</span>&nbsp; <span class='diff-add'> var kernel_name = utils.get_url_param('kernel_name');</span>&nbsp; <span class='diff-add'> if (kernel_name) {</span>&nbsp; <span class='diff-add'> this.kernel_selector.set_kernel(kernel_name);</span>&nbsp; <span class='diff-add'> } else if (this.metadata.kernelspec) {</span>&nbsp; <span class='diff-add'> this.kernel_selector.set_kernel(this.metadata.kernelspec);</span>&nbsp; <span class='diff-add'> } else if (this.metadata.language) {</span>&nbsp; <span class='diff-add'> // compat with IJulia, IHaskell, and other early kernels</span>&nbsp; <span class='diff-add'> // adopters that where setting a language metadata.</span>&nbsp; <span class='diff-add'> this.kernel_selector.set_kernel({</span>&nbsp; <span class='diff-add'> name: "(No name)",</span>&nbsp; <span class='diff-add'> language: this.metadata.language</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // this should be stored in kspec now, delete it.</span>&nbsp; <span class='diff-add'> // remove once we do not support notebook v3 anymore.</span>&nbsp; <span class='diff-add'> delete this.metadata.language;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // setting kernel via set_kernel above triggers start_session,</span>&nbsp; <span class='diff-add'> // otherwise start a new session with the server's default kernel</span>&nbsp; <span class='diff-add'> // spec_changed events will fire after kernel is loaded</span>&nbsp; <span class='diff-add'> this.start_session();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // load our checkpoint list</span>&nbsp; <span class='diff-add'> this.list_checkpoints();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // load toolbar state</span>&nbsp; <span class='diff-add'> if (this.metadata.celltoolbar) {</span>&nbsp; <span class='diff-add'> celltoolbar.CellToolbar.global_show();</span>&nbsp; <span class='diff-add'> celltoolbar.CellToolbar.activate_preset(this.metadata.celltoolbar);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> celltoolbar.CellToolbar.global_hide();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (!this.writable) {</span>&nbsp; <span class='diff-add'> this.set_autosave_interval(0);</span>&nbsp; <span class='diff-add'> this.events.trigger('notebook_read_only.Notebook');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // now that we're fully loaded, it is safe to restore save functionality</span>&nbsp; <span class='diff-add'> this._fully_loaded = true;</span>&nbsp; <span class='diff-add'> this.events.trigger('notebook_loaded.Notebook');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Notebook.prototype.set_kernelselector = function(k_selector){</span>&nbsp; <span class='diff-add'> this.kernel_selector = k_selector;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Failure callback for loading a notebook from the server.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {Error} error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.load_notebook_error = function (error) {</span>&nbsp; <span class='diff-add'> this.events.trigger('notebook_load_failed.Notebook', error);</span>&nbsp; <span class='diff-add'> var msg;</span>&nbsp; <span class='diff-add'> if (error.name === utils.XHR_ERROR && error.xhr.status === 500) {</span>&nbsp; <span class='diff-add'> utils.log_ajax_error(error.xhr, error.xhr_status, error.xhr_error);</span>&nbsp; <span class='diff-add'> msg = "An unknown error occurred while loading this notebook. " +</span>&nbsp; <span class='diff-add'> "This version can load notebook formats " +</span>&nbsp; <span class='diff-add'> "v" + this.nbformat + " or earlier. See the server log for details.";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> msg = error.message;</span>&nbsp; <span class='diff-add'> console.warn('Error stack trace while loading notebook was:');</span>&nbsp; <span class='diff-add'> console.warn(error.stack);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> notebook: this,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span>&nbsp; <span class='diff-add'> title: "Error loading notebook",</span>&nbsp; <span class='diff-add'> body : msg,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> "OK": {}</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /********************* checkpoint-related ********************/</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Save the notebook then immediately create a checkpoint.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.save_checkpoint = function () {</span>&nbsp; <span class='diff-add'> this._checkpoint_after_save = true;</span>&nbsp; <span class='diff-add'> this.save_notebook();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Add a checkpoint for this notebook.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.add_checkpoint = function (checkpoint) {</span>&nbsp; <span class='diff-add'> var found = false;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < this.checkpoints.length; i++) {</span>&nbsp; <span class='diff-add'> var existing = this.checkpoints[i];</span>&nbsp; <span class='diff-add'> if (existing.id === checkpoint.id) {</span>&nbsp; <span class='diff-add'> found = true;</span>&nbsp; <span class='diff-add'> this.checkpoints[i] = checkpoint;</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!found) {</span>&nbsp; <span class='diff-add'> this.checkpoints.push(checkpoint);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.last_checkpoint = this.checkpoints[this.checkpoints.length - 1];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * List checkpoints for this notebook.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.list_checkpoints = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.contents.list_checkpoints(this.notebook_path).then(</span>&nbsp; <span class='diff-add'> $.proxy(this.list_checkpoints_success, this),</span>&nbsp; <span class='diff-add'> function(error) {</span>&nbsp; <span class='diff-add'> that.events.trigger('list_checkpoints_failed.Notebook', error);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Success callback for listing checkpoints.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {object} data - JSON representation of a checkpoint</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.list_checkpoints_success = function (data) {</span>&nbsp; <span class='diff-add'> this.checkpoints = data;</span>&nbsp; <span class='diff-add'> if (data.length) {</span>&nbsp; <span class='diff-add'> this.last_checkpoint = data[data.length - 1];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.last_checkpoint = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.events.trigger('checkpoints_listed.Notebook', [data]);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Create a checkpoint of this notebook on the server from the most recent save.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.create_checkpoint = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.contents.create_checkpoint(this.notebook_path).then(</span>&nbsp; <span class='diff-add'> $.proxy(this.create_checkpoint_success, this),</span>&nbsp; <span class='diff-add'> function (error) {</span>&nbsp; <span class='diff-add'> that.events.trigger('checkpoint_failed.Notebook', error);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Success callback for creating a checkpoint.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {object} data - JSON representation of a checkpoint</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.create_checkpoint_success = function (data) {</span>&nbsp; <span class='diff-add'> this.add_checkpoint(data);</span>&nbsp; <span class='diff-add'> this.events.trigger('checkpoint_created.Notebook', data);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Display the restore checkpoint dialog</span>&nbsp; <span class='diff-add'> * @param {string} checkpoint ID</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.restore_checkpoint_dialog = function (checkpoint) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> checkpoint = checkpoint || this.last_checkpoint;</span>&nbsp; <span class='diff-add'> if ( ! checkpoint ) {</span>&nbsp; <span class='diff-add'> console.log("restore dialog, but no checkpoint to restore to!");</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var body = $('<div/>').append(</span>&nbsp; <span class='diff-add'> $('<p/>').addClass("p-space").text(</span>&nbsp; <span class='diff-add'> "Are you sure you want to revert the notebook to " +</span>&nbsp; <span class='diff-add'> "the latest checkpoint?"</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<strong/>").text(</span>&nbsp; <span class='diff-add'> " This cannot be undone."</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $('<p/>').addClass("p-space").text("The checkpoint was last updated at:")</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $('<p/>').addClass("p-space").text(</span>&nbsp; <span class='diff-add'> moment(checkpoint.last_modified).format('LLLL') +</span>&nbsp; <span class='diff-add'> ' ('+moment(checkpoint.last_modified).fromNow()+')'// Long form: Tuesday, January 27, 2015 12:15 PM</span>&nbsp; <span class='diff-add'> ).css("text-align", "center")</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> notebook: this,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span>&nbsp; <span class='diff-add'> title : "Revert notebook to checkpoint",</span>&nbsp; <span class='diff-add'> body : body,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> Revert : {</span>&nbsp; <span class='diff-add'> class : "btn-danger",</span>&nbsp; <span class='diff-add'> click : function () {</span>&nbsp; <span class='diff-add'> that.restore_checkpoint(checkpoint.id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> Cancel : {}</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Restore the notebook to a checkpoint state.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {string} checkpoint ID</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.restore_checkpoint = function (checkpoint) {</span>&nbsp; <span class='diff-add'> this.events.trigger('notebook_restoring.Notebook', checkpoint);</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.contents.restore_checkpoint(this.notebook_path, checkpoint).then(</span>&nbsp; <span class='diff-add'> $.proxy(this.restore_checkpoint_success, this),</span>&nbsp; <span class='diff-add'> function (error) {</span>&nbsp; <span class='diff-add'> that.events.trigger('checkpoint_restore_failed.Notebook', error);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Success callback for restoring a notebook to a checkpoint.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.restore_checkpoint_success = function () {</span>&nbsp; <span class='diff-add'> this.events.trigger('checkpoint_restored.Notebook');</span>&nbsp; <span class='diff-add'> this.load_notebook(this.notebook_path);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Delete a notebook checkpoint.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * @param {string} checkpoint ID</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.delete_checkpoint = function (checkpoint) {</span>&nbsp; <span class='diff-add'> this.events.trigger('notebook_restoring.Notebook', checkpoint);</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.contents.delete_checkpoint(this.notebook_path, checkpoint).then(</span>&nbsp; <span class='diff-add'> $.proxy(this.delete_checkpoint_success, this),</span>&nbsp; <span class='diff-add'> function (error) {</span>&nbsp; <span class='diff-add'> that.events.trigger('checkpoint_delete_failed.Notebook', error);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Success callback for deleting a notebook checkpoint.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Notebook.prototype.delete_checkpoint_success = function () {</span>&nbsp; <span class='diff-add'> this.events.trigger('checkpoint_deleted.Notebook');</span>&nbsp; <span class='diff-add'> this.load_notebook(this.notebook_path);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // For backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.Notebook = Notebook;</span>&nbsp; <span class='diff-add'> return {'Notebook': Notebook};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/notificationarea(1).js b/ipynb/Array-feature-overlap-05_files/notificationarea(1).js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..53607fe</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/notificationarea(1).js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/notificationwidget',</span>&nbsp; <span class='diff-add'>], function($, notificationwidget) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> // store reference to the NotificationWidget class</span>&nbsp; <span class='diff-add'> var NotificationWidget = notificationwidget.NotificationWidget;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Construct the NotificationArea object. Options are:</span>&nbsp; <span class='diff-add'> * events: $(Events) instance</span>&nbsp; <span class='diff-add'> * save_widget: SaveWidget instance</span>&nbsp; <span class='diff-add'> * notebook: Notebook instance</span>&nbsp; <span class='diff-add'> * keyboard_manager: KeyboardManager instance</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {string} selector - a jQuery selector string for the</span>&nbsp; <span class='diff-add'> * notification area element</span>&nbsp; <span class='diff-add'> * @param {Object} [options] - a dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var NotificationArea = function (selector, options) {</span>&nbsp; <span class='diff-add'> this.selector = selector;</span>&nbsp; <span class='diff-add'> this.events = options.events;</span>&nbsp; <span class='diff-add'> if (this.selector !== undefined) {</span>&nbsp; <span class='diff-add'> this.element = $(selector);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.widget_dict = {};</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get a widget by name, creating it if it doesn't exist.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method widget</span>&nbsp; <span class='diff-add'> * @param {string} name - the widget name</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotificationArea.prototype.widget = function (name) {</span>&nbsp; <span class='diff-add'> if (this.widget_dict[name] === undefined) {</span>&nbsp; <span class='diff-add'> return this.new_notification_widget(name);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.get_widget(name);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get a widget by name, throwing an error if it doesn't exist.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method get_widget</span>&nbsp; <span class='diff-add'> * @param {string} name - the widget name</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotificationArea.prototype.get_widget = function (name) {</span>&nbsp; <span class='diff-add'> if(this.widget_dict[name] === undefined) {</span>&nbsp; <span class='diff-add'> throw('no widgets with this name');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return this.widget_dict[name];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Create a new notification widget with the given name. The</span>&nbsp; <span class='diff-add'> * widget must not already exist.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method new_notification_widget</span>&nbsp; <span class='diff-add'> * @param {string} name - the widget name</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotificationArea.prototype.new_notification_widget = function (name) {</span>&nbsp; <span class='diff-add'> if (this.widget_dict[name] !== undefined) {</span>&nbsp; <span class='diff-add'> throw('widget with that name already exists!');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // create the element for the notification widget and add it</span>&nbsp; <span class='diff-add'> // to the notification aread element</span>&nbsp; <span class='diff-add'> var div = $('<div/>').attr('id', 'notification_' + name);</span>&nbsp; <span class='diff-add'> $(this.selector).append(div);</span>&nbsp; <span class='diff-add'> // create the widget object and return it</span>&nbsp; <span class='diff-add'> this.widget_dict[name] = new NotificationWidget('#notification_' + name);</span>&nbsp; <span class='diff-add'> return this.widget_dict[name];</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return {'NotificationArea': NotificationArea};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/notificationarea.js b/ipynb/Array-feature-overlap-05_files/notificationarea.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..a083bf1</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/notificationarea.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'base/js/dialog',</span>&nbsp; <span class='diff-add'> 'base/js/notificationarea',</span>&nbsp; <span class='diff-add'> 'moment'</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils, dialog, notificationarea, moment) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var NotificationArea = notificationarea.NotificationArea;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var NotebookNotificationArea = function(selector, options) {</span>&nbsp; <span class='diff-add'> NotificationArea.apply(this, [selector, options]);</span>&nbsp; <span class='diff-add'> this.save_widget = options.save_widget;</span>&nbsp; <span class='diff-add'> this.notebook = options.notebook;</span>&nbsp; <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> NotebookNotificationArea.prototype = Object.create(NotificationArea.prototype);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Initialize the default set of notification widgets.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method init_notification_widgets</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotebookNotificationArea.prototype.init_notification_widgets = function () {</span>&nbsp; <span class='diff-add'> this.init_kernel_notification_widget();</span>&nbsp; <span class='diff-add'> this.init_notebook_notification_widget();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Initialize the notification widget for kernel status messages.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method init_kernel_notification_widget</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotebookNotificationArea.prototype.init_kernel_notification_widget = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var knw = this.new_notification_widget('kernel');</span>&nbsp; <span class='diff-add'> var $kernel_ind_icon = $("#kernel_indicator_icon");</span>&nbsp; <span class='diff-add'> var $modal_ind_icon = $("#modal_indicator");</span>&nbsp; <span class='diff-add'> var $readonly_ind_icon = $('#readonly-indicator');</span>&nbsp; <span class='diff-add'> var $body = $('body');</span>&nbsp; <span class='diff-add'> // Listen for the notebook loaded event. Set readonly indicator.</span>&nbsp; <span class='diff-add'> this.events.on('notebook_loaded.Notebook', function() {</span>&nbsp; <span class='diff-add'> if (that.notebook.writable) {</span>&nbsp; <span class='diff-add'> $readonly_ind_icon.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> $readonly_ind_icon.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Command/Edit mode</span>&nbsp; <span class='diff-add'> this.events.on('edit_mode.Notebook', function () {</span>&nbsp; <span class='diff-add'> that.save_widget.update_document_title();</span>&nbsp; <span class='diff-add'> $body.addClass('edit_mode');</span>&nbsp; <span class='diff-add'> $body.removeClass('command_mode');</span>&nbsp; <span class='diff-add'> $modal_ind_icon.attr('title','Edit Mode');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('command_mode.Notebook', function () {</span>&nbsp; <span class='diff-add'> that.save_widget.update_document_title();</span>&nbsp; <span class='diff-add'> $body.removeClass('edit_mode');</span>&nbsp; <span class='diff-add'> $body.addClass('command_mode');</span>&nbsp; <span class='diff-add'> $modal_ind_icon.attr('title','Command Mode');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Implicitly start off in Command mode, switching to Edit mode will trigger event</span>&nbsp; <span class='diff-add'> $modal_ind_icon.addClass('modal_indicator').attr('title','Command Mode');</span>&nbsp; <span class='diff-add'> $body.addClass('command_mode');</span>&nbsp; <span class='diff-add'> // Kernel events</span>&nbsp; <span class='diff-add'> // this can be either kernel_created.Kernel or kernel_created.Session</span>&nbsp; <span class='diff-add'> this.events.on('kernel_created.Kernel kernel_created.Session', function () {</span>&nbsp; <span class='diff-add'> knw.info("Kernel Created", 500);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_reconnecting.Kernel', function () {</span>&nbsp; <span class='diff-add'> knw.warning("Connecting to kernel");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_connection_dead.Kernel', function (evt, info) {</span>&nbsp; <span class='diff-add'> knw.danger("Not Connected", undefined, function () {</span>&nbsp; <span class='diff-add'> // schedule reconnect a short time in the future, don't reconnect immediately</span>&nbsp; <span class='diff-add'> setTimeout($.proxy(info.kernel.reconnect, info.kernel), 500);</span>&nbsp; <span class='diff-add'> }, {title: 'click to reconnect'});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_connected.Kernel', function () {</span>&nbsp; <span class='diff-add'> knw.info("Connected", 500);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_restarting.Kernel', function () {</span>&nbsp; <span class='diff-add'> that.save_widget.update_document_title();</span>&nbsp; <span class='diff-add'> knw.set_message("Restarting kernel", 2000);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_autorestarting.Kernel', function (evt, info) {</span>&nbsp; <span class='diff-add'> // Only show the dialog on the first restart attempt. This</span>&nbsp; <span class='diff-add'> // number gets tracked by the `Kernel` object and passed</span>&nbsp; <span class='diff-add'> // along here, because we don't want to show the user 5</span>&nbsp; <span class='diff-add'> // dialogs saying the same thing (which is the number of</span>&nbsp; <span class='diff-add'> // times it tries restarting).</span>&nbsp; <span class='diff-add'> if (info.attempt === 1) {</span>&nbsp; <span class='diff-add'> dialog.kernel_modal({</span>&nbsp; <span class='diff-add'> notebook: that.notebook,</span>&nbsp; <span class='diff-add'> keyboard_manager: that.keyboard_manager,</span>&nbsp; <span class='diff-add'> title: "Kernel Restarting",</span>&nbsp; <span class='diff-add'> body: "The kernel appears to have died. It will restart automatically.",</span>&nbsp; <span class='diff-add'> buttons: {</span>&nbsp; <span class='diff-add'> OK : {</span>&nbsp; <span class='diff-add'> class : "btn-primary"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> that.save_widget.update_document_title();</span>&nbsp; <span class='diff-add'> knw.danger("Dead kernel");</span>&nbsp; <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_dead_icon').attr('title','Kernel Dead');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_interrupting.Kernel', function () {</span>&nbsp; <span class='diff-add'> knw.set_message("Interrupting kernel", 2000);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_disconnected.Kernel', function () {</span>&nbsp; <span class='diff-add'> $kernel_ind_icon</span>&nbsp; <span class='diff-add'> .attr('class', 'kernel_disconnected_icon')</span>&nbsp; <span class='diff-add'> .attr('title', 'No Connection to Kernel');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_connection_failed.Kernel', function (evt, info) {</span>&nbsp; <span class='diff-add'> // only show the dialog if this is the first failed</span>&nbsp; <span class='diff-add'> // connect attempt, because the kernel will continue</span>&nbsp; <span class='diff-add'> // trying to reconnect and we don't want to spam the user</span>&nbsp; <span class='diff-add'> // with messages</span>&nbsp; <span class='diff-add'> if (info.attempt === 1) {</span>&nbsp; <span class='diff-add'> var msg = "A connection to the notebook server could not be established." +</span>&nbsp; <span class='diff-add'> " The notebook will continue trying to reconnect, but" +</span>&nbsp; <span class='diff-add'> " until it does, you will NOT be able to run code. Check your" +</span>&nbsp; <span class='diff-add'> " network connection or notebook server configuration.";</span>&nbsp; <span class='diff-add'> dialog.kernel_modal({</span>&nbsp; <span class='diff-add'> title: "Connection failed",</span>&nbsp; <span class='diff-add'> body: msg,</span>&nbsp; <span class='diff-add'> keyboard_manager: that.keyboard_manager,</span>&nbsp; <span class='diff-add'> notebook: that.notebook,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> "OK": {}</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_killed.Kernel kernel_killed.Session', function () {</span>&nbsp; <span class='diff-add'> that.save_widget.update_document_title();</span>&nbsp; <span class='diff-add'> knw.warning("No kernel");</span>&nbsp; <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_busy_icon').attr('title','Kernel is not running');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_dead.Kernel', function () {</span>&nbsp; <span class='diff-add'> var showMsg = function () {</span>&nbsp; <span class='diff-add'> var msg = 'The kernel has died, and the automatic restart has failed.' +</span>&nbsp; <span class='diff-add'> ' It is possible the kernel cannot be restarted.' +</span>&nbsp; <span class='diff-add'> ' If you are not able to restart the kernel, you will still be able to save' +</span>&nbsp; <span class='diff-add'> ' the notebook, but running code will no longer work until the notebook' +</span>&nbsp; <span class='diff-add'> ' is reopened.';</span>&nbsp; <span class='diff-add'> dialog.kernel_modal({</span>&nbsp; <span class='diff-add'> title: "Dead kernel",</span>&nbsp; <span class='diff-add'> body : msg,</span>&nbsp; <span class='diff-add'> keyboard_manager: that.keyboard_manager,</span>&nbsp; <span class='diff-add'> notebook: that.notebook,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> "Manual Restart": {</span>&nbsp; <span class='diff-add'> class: "btn-danger",</span>&nbsp; <span class='diff-add'> click: function () {</span>&nbsp; <span class='diff-add'> that.notebook.start_session();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> "Don't restart": {}</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> that.save_widget.update_document_title();</span>&nbsp; <span class='diff-add'> knw.danger("Dead kernel", undefined, showMsg);</span>&nbsp; <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_dead_icon').attr('title','Kernel Dead');</span>&nbsp; <span class='diff-add'> showMsg();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.events.on("no_kernel.Kernel", function (evt, data) {</span>&nbsp; <span class='diff-add'> $("#kernel_indicator").find('.kernel_indicator_name').text("No Kernel");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_dead.Session', function (evt, info) {</span>&nbsp; <span class='diff-add'> var full = info.xhr.responseJSON.message;</span>&nbsp; <span class='diff-add'> var short = info.xhr.responseJSON.short_message || 'Kernel error';</span>&nbsp; <span class='diff-add'> var traceback = info.xhr.responseJSON.traceback;</span>&nbsp; <span class='diff-add'> var showMsg = function () {</span>&nbsp; <span class='diff-add'> var msg = $('<div/>').append($('<p/>').text(full));</span>&nbsp; <span class='diff-add'> var cm, cm_elem, cm_open;</span>&nbsp; <span class='diff-add'> if (traceback) {</span>&nbsp; <span class='diff-add'> cm_elem = $('<div/>')</span>&nbsp; <span class='diff-add'> .css('margin-top', '1em')</span>&nbsp; <span class='diff-add'> .css('padding', '1em')</span>&nbsp; <span class='diff-add'> .addClass('output_scroll');</span>&nbsp; <span class='diff-add'> msg.append(cm_elem);</span>&nbsp; <span class='diff-add'> cm = CodeMirror(cm_elem.get(0), {</span>&nbsp; <span class='diff-add'> mode: "python",</span>&nbsp; <span class='diff-add'> readOnly : true</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> cm.setValue(traceback);</span>&nbsp; <span class='diff-add'> cm_open = $.proxy(cm.refresh, cm);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> dialog.kernel_modal({</span>&nbsp; <span class='diff-add'> title: "Failed to start the kernel",</span>&nbsp; <span class='diff-add'> body : msg,</span>&nbsp; <span class='diff-add'> keyboard_manager: that.keyboard_manager,</span>&nbsp; <span class='diff-add'> notebook: that.notebook,</span>&nbsp; <span class='diff-add'> open: cm_open,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> "Ok": { class: 'btn-primary' }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> that.save_widget.update_document_title();</span>&nbsp; <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_dead_icon').attr('title','Kernel Dead');</span>&nbsp; <span class='diff-add'> knw.danger(short, undefined, showMsg);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_starting.Kernel kernel_created.Session', function () {</span>&nbsp; <span class='diff-add'> window.document.title='(Starting) '+window.document.title;</span>&nbsp; <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_busy_icon').attr('title','Kernel Busy');</span>&nbsp; <span class='diff-add'> knw.set_message("Kernel starting, please wait...");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_ready.Kernel', function () {</span>&nbsp; <span class='diff-add'> that.save_widget.update_document_title();</span>&nbsp; <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_idle_icon').attr('title','Kernel Idle');</span>&nbsp; <span class='diff-add'> knw.info("Kernel ready", 500);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_idle.Kernel', function () {</span>&nbsp; <span class='diff-add'> that.save_widget.update_document_title();</span>&nbsp; <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_idle_icon').attr('title','Kernel Idle');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('kernel_busy.Kernel', function () {</span>&nbsp; <span class='diff-add'> window.document.title='(Busy) '+window.document.title;</span>&nbsp; <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_busy_icon').attr('title','Kernel Busy');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('spec_match_found.Kernel', function (evt, data) {</span>&nbsp; <span class='diff-add'> that.widget('kernelspec').info("Using kernel: " + data.found.spec.display_name, 3000, undefined, {</span>&nbsp; <span class='diff-add'> title: "Only candidate for language: " + data.selected.language + " was " + data.found.spec.display_name</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Start the kernel indicator in the busy state, and send a kernel_info request.</span>&nbsp; <span class='diff-add'> // When the kernel_info reply arrives, the kernel is idle.</span>&nbsp; <span class='diff-add'> $kernel_ind_icon.attr('class','kernel_busy_icon').attr('title','Kernel Busy');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Initialize the notification widget for notebook status messages.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method init_notebook_notification_widget</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotebookNotificationArea.prototype.init_notebook_notification_widget = function () {</span>&nbsp; <span class='diff-add'> var nnw = this.new_notification_widget('notebook');</span>&nbsp; <span class='diff-add'> // Notebook events</span>&nbsp; <span class='diff-add'> this.events.on('notebook_loading.Notebook', function () {</span>&nbsp; <span class='diff-add'> nnw.set_message("Loading notebook",500);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('notebook_loaded.Notebook', function () {</span>&nbsp; <span class='diff-add'> nnw.set_message("Notebook loaded",500);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('notebook_saving.Notebook', function () {</span>&nbsp; <span class='diff-add'> nnw.set_message("Saving notebook",500);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('notebook_saved.Notebook', function () {</span>&nbsp; <span class='diff-add'> nnw.set_message("Notebook saved",2000);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('notebook_save_failed.Notebook', function (evt, error) {</span>&nbsp; <span class='diff-add'> nnw.warning(error.message || "Notebook save failed");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('notebook_copy_failed.Notebook', function (evt, error) {</span>&nbsp; <span class='diff-add'> nnw.warning(error.message || "Notebook copy failed");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Checkpoint events</span>&nbsp; <span class='diff-add'> this.events.on('checkpoint_created.Notebook', function (evt, data) {</span>&nbsp; <span class='diff-add'> var msg = "Checkpoint created";</span>&nbsp; <span class='diff-add'> if (data.last_modified) {</span>&nbsp; <span class='diff-add'> var d = new Date(data.last_modified);</span>&nbsp; <span class='diff-add'> msg = msg + ": " + moment(d).format("HH:mm:ss");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> nnw.set_message(msg, 2000);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('checkpoint_failed.Notebook', function () {</span>&nbsp; <span class='diff-add'> nnw.warning("Checkpoint failed");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('checkpoint_deleted.Notebook', function () {</span>&nbsp; <span class='diff-add'> nnw.set_message("Checkpoint deleted", 500);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('checkpoint_delete_failed.Notebook', function () {</span>&nbsp; <span class='diff-add'> nnw.warning("Checkpoint delete failed");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('checkpoint_restoring.Notebook', function () {</span>&nbsp; <span class='diff-add'> nnw.set_message("Restoring to checkpoint...", 500);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('checkpoint_restore_failed.Notebook', function () {</span>&nbsp; <span class='diff-add'> nnw.warning("Checkpoint restore failed");</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Autosave events</span>&nbsp; <span class='diff-add'> this.events.on('autosave_disabled.Notebook', function () {</span>&nbsp; <span class='diff-add'> nnw.set_message("Autosave disabled", 2000);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('autosave_enabled.Notebook', function (evt, interval) {</span>&nbsp; <span class='diff-add'> nnw.set_message("Saving every " + interval / 1000 + "s", 1000);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatibility.</span>&nbsp; <span class='diff-add'> IPython.NotificationArea = NotebookNotificationArea;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> return {'NotebookNotificationArea': NotebookNotificationArea};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/notificationwidget.js b/ipynb/Array-feature-overlap-05_files/notificationwidget.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..303ca2b</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/notificationwidget.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'>], function(IPython, $) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Construct a NotificationWidget object.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {string} selector - a jQuery selector string for the</span>&nbsp; <span class='diff-add'> * notification widget element</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var NotificationWidget = function (selector) {</span>&nbsp; <span class='diff-add'> this.selector = selector;</span>&nbsp; <span class='diff-add'> this.timeout = null;</span>&nbsp; <span class='diff-add'> this.busy = false;</span>&nbsp; <span class='diff-add'> if (this.selector !== undefined) {</span>&nbsp; <span class='diff-add'> this.element = $(selector);</span>&nbsp; <span class='diff-add'> this.style();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.element.hide();</span>&nbsp; <span class='diff-add'> this.inner = $('<span/>');</span>&nbsp; <span class='diff-add'> this.element.append(this.inner);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Add the 'notification_widget' CSS class to the widget element.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method style</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotificationWidget.prototype.style = function () {</span>&nbsp; <span class='diff-add'> // use explicit bootstrap classes here,</span>&nbsp; <span class='diff-add'> // because multiple inheritance in LESS doesn't work</span>&nbsp; <span class='diff-add'> // for this particular combination</span>&nbsp; <span class='diff-add'> this.element.addClass('notification_widget btn btn-xs navbar-btn');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * hide the widget and empty the text</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> NotificationWidget.prototype.hide = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.element.fadeOut(100, function(){that.inner.text('');});</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set the notification widget message to display for a certain</span>&nbsp; <span class='diff-add'> * amount of time (timeout). The widget will be shown forever if</span>&nbsp; <span class='diff-add'> * timeout is <= 0 or undefined. If the widget is clicked while it</span>&nbsp; <span class='diff-add'> * is still displayed, execute an optional callback</span>&nbsp; <span class='diff-add'> * (click_callback). If the callback returns false, it will</span>&nbsp; <span class='diff-add'> * prevent the notification from being dismissed.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Options:</span>&nbsp; <span class='diff-add'> * class - CSS class name for styling</span>&nbsp; <span class='diff-add'> * icon - CSS class name for the widget icon</span>&nbsp; <span class='diff-add'> * title - HTML title attribute for the widget</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method set_message</span>&nbsp; <span class='diff-add'> * @param {string} msg - The notification to display</span>&nbsp; <span class='diff-add'> * @param {integer} [timeout] - The amount of time in milliseconds to display the widget</span>&nbsp; <span class='diff-add'> * @param {function} [click_callback] - The function to run when the widget is clicked</span>&nbsp; <span class='diff-add'> * @param {Object} [options] - Additional options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotificationWidget.prototype.set_message = function (msg, timeout, click_callback, options) {</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> // unbind potential previous callback</span>&nbsp; <span class='diff-add'> this.element.unbind('click');</span>&nbsp; <span class='diff-add'> this.inner.attr('class', options.icon);</span>&nbsp; <span class='diff-add'> this.inner.attr('title', options.title);</span>&nbsp; <span class='diff-add'> this.inner.text(msg);</span>&nbsp; <span class='diff-add'> this.element.fadeIn(100);</span>&nbsp; <span class='diff-add'> // reset previous set style</span>&nbsp; <span class='diff-add'> this.element.removeClass();</span>&nbsp; <span class='diff-add'> this.style();</span>&nbsp; <span class='diff-add'> if (options.class) {</span>&nbsp; <span class='diff-add'> this.element.addClass(options.class);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // clear previous timer</span>&nbsp; <span class='diff-add'> if (this.timeout !== null) {</span>&nbsp; <span class='diff-add'> clearTimeout(this.timeout);</span>&nbsp; <span class='diff-add'> this.timeout = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // set the timer if a timeout is given</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> if (timeout !== undefined && timeout >= 0) {</span>&nbsp; <span class='diff-add'> this.timeout = setTimeout(function () {</span>&nbsp; <span class='diff-add'> that.element.fadeOut(100, function () {that.inner.text('');});</span>&nbsp; <span class='diff-add'> that.element.unbind('click');</span>&nbsp; <span class='diff-add'> that.timeout = null;</span>&nbsp; <span class='diff-add'> }, timeout);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // if no click callback assume we will just dismiss the notification</span>&nbsp; <span class='diff-add'> if (click_callback === undefined) {</span>&nbsp; <span class='diff-add'> click_callback = function(){return true};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // on click, remove widget if click callback say so</span>&nbsp; <span class='diff-add'> // and unbind click event.</span>&nbsp; <span class='diff-add'> this.element.click(function () {</span>&nbsp; <span class='diff-add'> if (click_callback() !== false) {</span>&nbsp; <span class='diff-add'> that.element.fadeOut(100, function () {that.inner.text('');});</span>&nbsp; <span class='diff-add'> that.element.unbind('click');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (that.timeout !== null) {</span>&nbsp; <span class='diff-add'> clearTimeout(that.timeout);</span>&nbsp; <span class='diff-add'> that.timeout = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Display an information message (styled with the 'info'</span>&nbsp; <span class='diff-add'> * class). Arguments are the same as in set_message. Default</span>&nbsp; <span class='diff-add'> * timeout is 3500 milliseconds.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method info</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotificationWidget.prototype.info = function (msg, timeout, click_callback, options) {</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> options.class = options.class + ' info';</span>&nbsp; <span class='diff-add'> timeout = timeout || 3500;</span>&nbsp; <span class='diff-add'> this.set_message(msg, timeout, click_callback, options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Display a warning message (styled with the 'warning'</span>&nbsp; <span class='diff-add'> * class). Arguments are the same as in set_message. Messages are</span>&nbsp; <span class='diff-add'> * sticky by default.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method warning</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotificationWidget.prototype.warning = function (msg, timeout, click_callback, options) {</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> options.class = options.class + ' warning';</span>&nbsp; <span class='diff-add'> this.set_message(msg, timeout, click_callback, options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Display a danger message (styled with the 'danger'</span>&nbsp; <span class='diff-add'> * class). Arguments are the same as in set_message. Messages are</span>&nbsp; <span class='diff-add'> * sticky by default.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method danger</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotificationWidget.prototype.danger = function (msg, timeout, click_callback, options) {</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> options.class = options.class + ' danger';</span>&nbsp; <span class='diff-add'> this.set_message(msg, timeout, click_callback, options);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get the text of the widget message.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method get_message</span>&nbsp; <span class='diff-add'> * @return {string} - the message text</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> NotificationWidget.prototype.get_message = function () {</span>&nbsp; <span class='diff-add'> return this.inner.html();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // For backwards compatibility.</span>&nbsp; <span class='diff-add'> IPython.NotificationWidget = NotificationWidget;</span>&nbsp; <span class='diff-add'> return {'NotificationWidget': NotificationWidget};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/outputarea.js b/ipynb/Array-feature-overlap-05_files/outputarea.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..571bfa7</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/outputarea.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jqueryui',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'base/js/security',</span>&nbsp; <span class='diff-add'> 'base/js/keyboard',</span>&nbsp; <span class='diff-add'> 'notebook/js/mathjaxutils',</span>&nbsp; <span class='diff-add'> 'components/marked/lib/marked',</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils, security, keyboard, mathjaxutils, marked) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @class OutputArea</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var OutputArea = function (options) {</span>&nbsp; <span class='diff-add'> this.selector = options.selector;</span>&nbsp; <span class='diff-add'> this.events = options.events;</span>&nbsp; <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span>&nbsp; <span class='diff-add'> this.wrapper = $(options.selector);</span>&nbsp; <span class='diff-add'> this.outputs = [];</span>&nbsp; <span class='diff-add'> this.collapsed = false;</span>&nbsp; <span class='diff-add'> this.scrolled = false;</span>&nbsp; <span class='diff-add'> this.scroll_state = 'auto';</span>&nbsp; <span class='diff-add'> this.trusted = true;</span>&nbsp; <span class='diff-add'> this.clear_queued = null;</span>&nbsp; <span class='diff-add'> if (options.prompt_area === undefined) {</span>&nbsp; <span class='diff-add'> this.prompt_area = true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.prompt_area = options.prompt_area;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.create_elements();</span>&nbsp; <span class='diff-add'> this.style();</span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Class prototypes</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> OutputArea.prototype.create_elements = function () {</span>&nbsp; <span class='diff-add'> this.element = $("<div/>");</span>&nbsp; <span class='diff-add'> this.collapse_button = $("<div/>");</span>&nbsp; <span class='diff-add'> this.prompt_overlay = $("<div/>");</span>&nbsp; <span class='diff-add'> this.wrapper.append(this.prompt_overlay);</span>&nbsp; <span class='diff-add'> this.wrapper.append(this.element);</span>&nbsp; <span class='diff-add'> this.wrapper.append(this.collapse_button);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.style = function () {</span>&nbsp; <span class='diff-add'> this.collapse_button.hide();</span>&nbsp; <span class='diff-add'> this.prompt_overlay.hide();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.wrapper.addClass('output_wrapper');</span>&nbsp; <span class='diff-add'> this.element.addClass('output');</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.collapse_button.addClass("btn btn-default output_collapsed");</span>&nbsp; <span class='diff-add'> this.collapse_button.attr('title', 'click to expand output');</span>&nbsp; <span class='diff-add'> this.collapse_button.text('. . .');</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.prompt_overlay.addClass('out_prompt_overlay prompt');</span>&nbsp; <span class='diff-add'> this.prompt_overlay.attr('title', 'click to expand output; double click to hide output');</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.collapse();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Should the OutputArea scroll?</span>&nbsp; <span class='diff-add'> * Returns whether the height (in lines) exceeds the current threshold.</span>&nbsp; <span class='diff-add'> * Threshold will be OutputArea.minimum_scroll_threshold if scroll_state=true (manually requested)</span>&nbsp; <span class='diff-add'> * or OutputArea.auto_scroll_threshold if scroll_state='auto'.</span>&nbsp; <span class='diff-add'> * This will always return false if scroll_state=false (scroll disabled).</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> OutputArea.prototype._should_scroll = function () {</span>&nbsp; <span class='diff-add'> var threshold;</span>&nbsp; <span class='diff-add'> if (this.scroll_state === false) {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> } else if (this.scroll_state === true) {</span>&nbsp; <span class='diff-add'> threshold = OutputArea.minimum_scroll_threshold;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> threshold = OutputArea.auto_scroll_threshold;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (threshold <=0) {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // line-height from http://stackoverflow.com/questions/1185151</span>&nbsp; <span class='diff-add'> var fontSize = this.element.css('font-size');</span>&nbsp; <span class='diff-add'> var lineHeight = Math.floor(parseInt(fontSize.replace('px','')) * 1.5);</span>&nbsp; <span class='diff-add'> return (this.element.height() > threshold * lineHeight);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.prompt_overlay.dblclick(function () { that.toggle_output(); });</span>&nbsp; <span class='diff-add'> this.prompt_overlay.click(function () { that.toggle_scroll(); });</span>&nbsp; <span class='diff-add'> this.element.resize(function () {</span>&nbsp; <span class='diff-add'> // FIXME: Firefox on Linux misbehaves, so automatic scrolling is disabled</span>&nbsp; <span class='diff-add'> if ( utils.browser[0] === "Firefox" ) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // maybe scroll output,</span>&nbsp; <span class='diff-add'> // if it's grown large enough and hasn't already been scrolled.</span>&nbsp; <span class='diff-add'> if (!that.scrolled && that._should_scroll()) {</span>&nbsp; <span class='diff-add'> that.scroll_area();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.collapse_button.click(function () {</span>&nbsp; <span class='diff-add'> that.expand();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.collapse = function () {</span>&nbsp; <span class='diff-add'> if (!this.collapsed) {</span>&nbsp; <span class='diff-add'> this.element.hide();</span>&nbsp; <span class='diff-add'> this.prompt_overlay.hide();</span>&nbsp; <span class='diff-add'> if (this.element.html()){</span>&nbsp; <span class='diff-add'> this.collapse_button.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.collapsed = true;</span>&nbsp; <span class='diff-add'> // collapsing output clears scroll state</span>&nbsp; <span class='diff-add'> this.scroll_state = 'auto';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.expand = function () {</span>&nbsp; <span class='diff-add'> if (this.collapsed) {</span>&nbsp; <span class='diff-add'> this.collapse_button.hide();</span>&nbsp; <span class='diff-add'> this.element.show();</span>&nbsp; <span class='diff-add'> if (this.prompt_area) {</span>&nbsp; <span class='diff-add'> this.prompt_overlay.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.collapsed = false;</span>&nbsp; <span class='diff-add'> this.scroll_if_long();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.toggle_output = function () {</span>&nbsp; <span class='diff-add'> if (this.collapsed) {</span>&nbsp; <span class='diff-add'> this.expand();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.collapse();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.scroll_area = function () {</span>&nbsp; <span class='diff-add'> this.element.addClass('output_scroll');</span>&nbsp; <span class='diff-add'> this.prompt_overlay.attr('title', 'click to unscroll output; double click to hide');</span>&nbsp; <span class='diff-add'> this.scrolled = true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.unscroll_area = function () {</span>&nbsp; <span class='diff-add'> this.element.removeClass('output_scroll');</span>&nbsp; <span class='diff-add'> this.prompt_overlay.attr('title', 'click to scroll output; double click to hide');</span>&nbsp; <span class='diff-add'> this.scrolled = false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Scroll OutputArea if height exceeds a threshold.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Threshold is OutputArea.minimum_scroll_threshold if scroll_state = true,</span>&nbsp; <span class='diff-add'> * OutputArea.auto_scroll_threshold if scroll_state='auto'.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> OutputArea.prototype.scroll_if_long = function () {</span>&nbsp; <span class='diff-add'> var should_scroll = this._should_scroll();</span>&nbsp; <span class='diff-add'> if (!this.scrolled && should_scroll) {</span>&nbsp; <span class='diff-add'> // only allow scrolling long-enough output</span>&nbsp; <span class='diff-add'> this.scroll_area();</span>&nbsp; <span class='diff-add'> } else if (this.scrolled && !should_scroll) {</span>&nbsp; <span class='diff-add'> // scrolled and shouldn't be</span>&nbsp; <span class='diff-add'> this.unscroll_area();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.toggle_scroll = function () {</span>&nbsp; <span class='diff-add'> if (this.scroll_state == 'auto') {</span>&nbsp; <span class='diff-add'> this.scroll_state = !this.scrolled;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.scroll_state = !this.scroll_state;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.scrolled) {</span>&nbsp; <span class='diff-add'> this.unscroll_area();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // only allow scrolling long-enough output</span>&nbsp; <span class='diff-add'> this.scroll_if_long();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // typeset with MathJax if MathJax is available</span>&nbsp; <span class='diff-add'> OutputArea.prototype.typeset = function () {</span>&nbsp; <span class='diff-add'> utils.typeset(this.element);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.handle_output = function (msg) {</span>&nbsp; <span class='diff-add'> var json = {};</span>&nbsp; <span class='diff-add'> var msg_type = json.output_type = msg.header.msg_type;</span>&nbsp; <span class='diff-add'> var content = msg.content;</span>&nbsp; <span class='diff-add'> if (msg_type === "stream") {</span>&nbsp; <span class='diff-add'> json.text = content.text;</span>&nbsp; <span class='diff-add'> json.name = content.name;</span>&nbsp; <span class='diff-add'> } else if (msg_type === "display_data") {</span>&nbsp; <span class='diff-add'> json.data = content.data;</span>&nbsp; <span class='diff-add'> json.metadata = content.metadata;</span>&nbsp; <span class='diff-add'> } else if (msg_type === "execute_result") {</span>&nbsp; <span class='diff-add'> json.data = content.data;</span>&nbsp; <span class='diff-add'> json.metadata = content.metadata;</span>&nbsp; <span class='diff-add'> json.execution_count = content.execution_count;</span>&nbsp; <span class='diff-add'> } else if (msg_type === "error") {</span>&nbsp; <span class='diff-add'> json.ename = content.ename;</span>&nbsp; <span class='diff-add'> json.evalue = content.evalue;</span>&nbsp; <span class='diff-add'> json.traceback = content.traceback;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> console.log("unhandled output message", msg);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.append_output(json);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> OutputArea.output_types = [</span>&nbsp; <span class='diff-add'> 'application/javascript',</span>&nbsp; <span class='diff-add'> 'text/html',</span>&nbsp; <span class='diff-add'> 'text/markdown',</span>&nbsp; <span class='diff-add'> 'text/latex',</span>&nbsp; <span class='diff-add'> 'image/svg+xml',</span>&nbsp; <span class='diff-add'> 'image/png',</span>&nbsp; <span class='diff-add'> 'image/jpeg',</span>&nbsp; <span class='diff-add'> 'application/pdf',</span>&nbsp; <span class='diff-add'> 'text/plain'</span>&nbsp; <span class='diff-add'> ];</span>&nbsp; <span class='diff-add'> OutputArea.prototype.validate_mimebundle = function (bundle) {</span>&nbsp; <span class='diff-add'> /** scrub invalid outputs */</span>&nbsp; <span class='diff-add'> if (typeof bundle.data !== 'object') {</span>&nbsp; <span class='diff-add'> console.warn("mimebundle missing data", bundle);</span>&nbsp; <span class='diff-add'> bundle.data = {};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof bundle.metadata !== 'object') {</span>&nbsp; <span class='diff-add'> console.warn("mimebundle missing metadata", bundle);</span>&nbsp; <span class='diff-add'> bundle.metadata = {};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var data = bundle.data;</span>&nbsp; <span class='diff-add'> $.map(OutputArea.output_types, function(key){</span>&nbsp; <span class='diff-add'> if (key !== 'application/json' &&</span>&nbsp; <span class='diff-add'> data[key] !== undefined &&</span>&nbsp; <span class='diff-add'> typeof data[key] !== 'string'</span>&nbsp; <span class='diff-add'> ) {</span>&nbsp; <span class='diff-add'> console.log("Invalid type for " + key, data[key]);</span>&nbsp; <span class='diff-add'> delete data[key];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return bundle;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> OutputArea.prototype.append_output = function (json) {</span>&nbsp; <span class='diff-add'> this.expand();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Clear the output if clear is queued.</span>&nbsp; <span class='diff-add'> var needs_height_reset = false;</span>&nbsp; <span class='diff-add'> if (this.clear_queued) {</span>&nbsp; <span class='diff-add'> this.clear_output(false);</span>&nbsp; <span class='diff-add'> needs_height_reset = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var record_output = true;</span>&nbsp; <span class='diff-add'> switch(json.output_type) {</span>&nbsp; <span class='diff-add'> case 'execute_result':</span>&nbsp; <span class='diff-add'> json = this.validate_mimebundle(json);</span>&nbsp; <span class='diff-add'> this.append_execute_result(json);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'stream':</span>&nbsp; <span class='diff-add'> // append_stream might have merged the output with earlier stream output</span>&nbsp; <span class='diff-add'> record_output = this.append_stream(json);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'error':</span>&nbsp; <span class='diff-add'> this.append_error(json);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'display_data':</span>&nbsp; <span class='diff-add'> // append handled below</span>&nbsp; <span class='diff-add'> json = this.validate_mimebundle(json);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> default:</span>&nbsp; <span class='diff-add'> console.log("unrecognized output type: " + json.output_type);</span>&nbsp; <span class='diff-add'> this.append_unrecognized(json);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // We must release the animation fixed height in a callback since Gecko</span>&nbsp; <span class='diff-add'> // (FireFox) doesn't render the image immediately as the data is </span>&nbsp; <span class='diff-add'> // available.</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var handle_appended = function ($el) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Only reset the height to automatic if the height is currently</span>&nbsp; <span class='diff-add'> * fixed (done by wait=True flag on clear_output).</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (needs_height_reset) {</span>&nbsp; <span class='diff-add'> that.element.height('');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> that.element.trigger('resize');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (json.output_type === 'display_data') {</span>&nbsp; <span class='diff-add'> this.append_display_data(json, handle_appended);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> handle_appended();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (record_output) {</span>&nbsp; <span class='diff-add'> this.outputs.push(json);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.create_output_area = function () {</span>&nbsp; <span class='diff-add'> var oa = $("<div/>").addClass("output_area");</span>&nbsp; <span class='diff-add'> if (this.prompt_area) {</span>&nbsp; <span class='diff-add'> oa.append($('<div/>').addClass('prompt'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return oa;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function _get_metadata_key(metadata, key, mime) {</span>&nbsp; <span class='diff-add'> var mime_md = metadata[mime];</span>&nbsp; <span class='diff-add'> // mime-specific higher priority</span>&nbsp; <span class='diff-add'> if (mime_md && mime_md[key] !== undefined) {</span>&nbsp; <span class='diff-add'> return mime_md[key];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // fallback on global</span>&nbsp; <span class='diff-add'> return metadata[key];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> OutputArea.prototype.create_output_subarea = function(md, classes, mime) {</span>&nbsp; <span class='diff-add'> var subarea = $('<div/>').addClass('output_subarea').addClass(classes);</span>&nbsp; <span class='diff-add'> if (_get_metadata_key(md, 'isolated', mime)) {</span>&nbsp; <span class='diff-add'> // Create an iframe to isolate the subarea from the rest of the</span>&nbsp; <span class='diff-add'> // document</span>&nbsp; <span class='diff-add'> var iframe = $('<iframe/>').addClass('box-flex1');</span>&nbsp; <span class='diff-add'> iframe.css({'height':1, 'width':'100%', 'display':'block'});</span>&nbsp; <span class='diff-add'> iframe.attr('frameborder', 0);</span>&nbsp; <span class='diff-add'> iframe.attr('scrolling', 'auto');</span>&nbsp; <span class='diff-add'> // Once the iframe is loaded, the subarea is dynamically inserted</span>&nbsp; <span class='diff-add'> iframe.on('load', function() {</span>&nbsp; <span class='diff-add'> // Workaround needed by Firefox, to properly render svg inside</span>&nbsp; <span class='diff-add'> // iframes, see http://stackoverflow.com/questions/10177190/</span>&nbsp; <span class='diff-add'> // svg-dynamically-added-to-iframe-does-not-render-correctly</span>&nbsp; <span class='diff-add'> this.contentDocument.open();</span>&nbsp; <span class='diff-add'> // Insert the subarea into the iframe</span>&nbsp; <span class='diff-add'> // We must directly write the html. When using Jquery's append</span>&nbsp; <span class='diff-add'> // method, javascript is evaluated in the parent document and</span>&nbsp; <span class='diff-add'> // not in the iframe document. At this point, subarea doesn't</span>&nbsp; <span class='diff-add'> // contain any user content.</span>&nbsp; <span class='diff-add'> this.contentDocument.write(subarea.html());</span>&nbsp; <span class='diff-add'> this.contentDocument.close();</span>&nbsp; <span class='diff-add'> var body = this.contentDocument.body;</span>&nbsp; <span class='diff-add'> // Adjust the iframe height automatically</span>&nbsp; <span class='diff-add'> iframe.height(body.scrollHeight + 'px');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Elements should be appended to the inner subarea and not to the</span>&nbsp; <span class='diff-add'> // iframe</span>&nbsp; <span class='diff-add'> iframe.append = function(that) {</span>&nbsp; <span class='diff-add'> subarea.append(that);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return iframe;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return subarea;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype._append_javascript_error = function (err, element) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * display a message when a javascript error occurs in display output</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var msg = "Javascript error adding output!";</span>&nbsp; <span class='diff-add'> if ( element === undefined ) return;</span>&nbsp; <span class='diff-add'> element</span>&nbsp; <span class='diff-add'> .append($('<div/>').text(msg).addClass('js-error'))</span>&nbsp; <span class='diff-add'> .append($('<div/>').text(err.toString()).addClass('js-error'))</span>&nbsp; <span class='diff-add'> .append($('<div/>').text('See your browser Javascript console for more details.').addClass('js-error'));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> OutputArea.prototype._safe_append = function (toinsert) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * safely append an item to the document</span>&nbsp; <span class='diff-add'> * this is an object created by user code,</span>&nbsp; <span class='diff-add'> * and may have errors, which should not be raised</span>&nbsp; <span class='diff-add'> * under any circumstances.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> this.element.append(toinsert);</span>&nbsp; <span class='diff-add'> } catch(err) {</span>&nbsp; <span class='diff-add'> console.log(err);</span>&nbsp; <span class='diff-add'> // Create an actual output_area and output_subarea, which creates</span>&nbsp; <span class='diff-add'> // the prompt area and the proper indentation.</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_area();</span>&nbsp; <span class='diff-add'> var subarea = $('<div/>').addClass('output_subarea');</span>&nbsp; <span class='diff-add'> toinsert.append(subarea);</span>&nbsp; <span class='diff-add'> this._append_javascript_error(err, subarea);</span>&nbsp; <span class='diff-add'> this.element.append(toinsert);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Notify others of changes.</span>&nbsp; <span class='diff-add'> this.element.trigger('changed');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.append_execute_result = function (json) {</span>&nbsp; <span class='diff-add'> var n = json.execution_count || ' ';</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_area();</span>&nbsp; <span class='diff-add'> if (this.prompt_area) {</span>&nbsp; <span class='diff-add'> toinsert.find('div.prompt').addClass('output_prompt').text('Out[' + n + ']:');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var inserted = this.append_mime_type(json, toinsert);</span>&nbsp; <span class='diff-add'> if (inserted) {</span>&nbsp; <span class='diff-add'> inserted.addClass('output_result');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._safe_append(toinsert);</span>&nbsp; <span class='diff-add'> // If we just output latex, typeset it.</span>&nbsp; <span class='diff-add'> if ((json.data['text/latex'] !== undefined) ||</span>&nbsp; <span class='diff-add'> (json.data['text/html'] !== undefined) ||</span>&nbsp; <span class='diff-add'> (json.data['text/markdown'] !== undefined)) {</span>&nbsp; <span class='diff-add'> this.typeset();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.append_error = function (json) {</span>&nbsp; <span class='diff-add'> var tb = json.traceback;</span>&nbsp; <span class='diff-add'> if (tb !== undefined && tb.length > 0) {</span>&nbsp; <span class='diff-add'> var s = '';</span>&nbsp; <span class='diff-add'> var len = tb.length;</span>&nbsp; <span class='diff-add'> for (var i=0; i<len; i++) {</span>&nbsp; <span class='diff-add'> s = s + tb[i] + '\n';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> s = s + '\n';</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_area();</span>&nbsp; <span class='diff-add'> var append_text = OutputArea.append_map['text/plain'];</span>&nbsp; <span class='diff-add'> if (append_text) {</span>&nbsp; <span class='diff-add'> append_text.apply(this, [s, {}, toinsert]).addClass('output_error');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._safe_append(toinsert);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.append_stream = function (json) {</span>&nbsp; <span class='diff-add'> var text = json.text;</span>&nbsp; <span class='diff-add'> if (typeof text !== 'string') {</span>&nbsp; <span class='diff-add'> console.error("Stream output is invalid (missing text)", json);</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var subclass = "output_"+json.name;</span>&nbsp; <span class='diff-add'> if (this.outputs.length > 0){</span>&nbsp; <span class='diff-add'> // have at least one output to consider</span>&nbsp; <span class='diff-add'> var last = this.outputs[this.outputs.length-1];</span>&nbsp; <span class='diff-add'> if (last.output_type == 'stream' && json.name == last.name){</span>&nbsp; <span class='diff-add'> // latest output was in the same stream,</span>&nbsp; <span class='diff-add'> // so append directly into its pre tag</span>&nbsp; <span class='diff-add'> // escape ANSI & HTML specials:</span>&nbsp; <span class='diff-add'> last.text = utils.fixCarriageReturn(last.text + json.text);</span>&nbsp; <span class='diff-add'> var pre = this.element.find('div.'+subclass).last().find('pre');</span>&nbsp; <span class='diff-add'> var html = utils.fixConsole(last.text);</span>&nbsp; <span class='diff-add'> // The only user content injected with this HTML call is</span>&nbsp; <span class='diff-add'> // escaped by the fixConsole() method.</span>&nbsp; <span class='diff-add'> pre.html(html);</span>&nbsp; <span class='diff-add'> // return false signals that we merged this output with the previous one,</span>&nbsp; <span class='diff-add'> // and the new output shouldn't be recorded.</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!text.replace("\r", "")) {</span>&nbsp; <span class='diff-add'> // text is nothing (empty string, \r, etc.)</span>&nbsp; <span class='diff-add'> // so don't append any elements, which might add undesirable space</span>&nbsp; <span class='diff-add'> // return true to indicate the output should be recorded.</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // If we got here, attach a new div</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_area();</span>&nbsp; <span class='diff-add'> var append_text = OutputArea.append_map['text/plain'];</span>&nbsp; <span class='diff-add'> if (append_text) {</span>&nbsp; <span class='diff-add'> append_text.apply(this, [text, {}, toinsert]).addClass("output_stream " + subclass);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._safe_append(toinsert);</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.append_unrecognized = function (json) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_area();</span>&nbsp; <span class='diff-add'> var subarea = $('<div/>').addClass('output_subarea output_unrecognized');</span>&nbsp; <span class='diff-add'> toinsert.append(subarea);</span>&nbsp; <span class='diff-add'> subarea.append(</span>&nbsp; <span class='diff-add'> $("<a>")</span>&nbsp; <span class='diff-add'> .attr("href", "#")</span>&nbsp; <span class='diff-add'> .text("Unrecognized output: " + json.output_type)</span>&nbsp; <span class='diff-add'> .click(function () {</span>&nbsp; <span class='diff-add'> that.events.trigger('unrecognized_output.OutputArea', {output: json});</span>&nbsp; <span class='diff-add'> })</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> this._safe_append(toinsert);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.append_display_data = function (json, handle_inserted) {</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_area();</span>&nbsp; <span class='diff-add'> if (this.append_mime_type(json, toinsert, handle_inserted)) {</span>&nbsp; <span class='diff-add'> this._safe_append(toinsert);</span>&nbsp; <span class='diff-add'> // If we just output latex, typeset it.</span>&nbsp; <span class='diff-add'> if ((json.data['text/latex'] !== undefined) ||</span>&nbsp; <span class='diff-add'> (json.data['text/html'] !== undefined) ||</span>&nbsp; <span class='diff-add'> (json.data['text/markdown'] !== undefined)) {</span>&nbsp; <span class='diff-add'> this.typeset();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.safe_outputs = {</span>&nbsp; <span class='diff-add'> 'text/plain' : true,</span>&nbsp; <span class='diff-add'> 'text/latex' : true,</span>&nbsp; <span class='diff-add'> 'image/png' : true,</span>&nbsp; <span class='diff-add'> 'image/jpeg' : true</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> OutputArea.prototype.append_mime_type = function (json, element, handle_inserted) {</span>&nbsp; <span class='diff-add'> for (var i=0; i < OutputArea.display_order.length; i++) {</span>&nbsp; <span class='diff-add'> var type = OutputArea.display_order[i];</span>&nbsp; <span class='diff-add'> var append = OutputArea.append_map[type];</span>&nbsp; <span class='diff-add'> if ((json.data[type] !== undefined) && append) {</span>&nbsp; <span class='diff-add'> var value = json.data[type];</span>&nbsp; <span class='diff-add'> if (!this.trusted && !OutputArea.safe_outputs[type]) {</span>&nbsp; <span class='diff-add'> // not trusted, sanitize HTML</span>&nbsp; <span class='diff-add'> if (type==='text/html' || type==='text/svg') {</span>&nbsp; <span class='diff-add'> value = security.sanitize_html(value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // don't display if we don't know how to sanitize it</span>&nbsp; <span class='diff-add'> console.log("Ignoring untrusted " + type + " output.");</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var md = json.metadata || {};</span>&nbsp; <span class='diff-add'> var toinsert = append.apply(this, [value, md, element, handle_inserted]);</span>&nbsp; <span class='diff-add'> // Since only the png and jpeg mime types call the inserted</span>&nbsp; <span class='diff-add'> // callback, if the mime type is something other we must call the </span>&nbsp; <span class='diff-add'> // inserted callback only when the element is actually inserted</span>&nbsp; <span class='diff-add'> // into the DOM. Use a timeout of 0 to do this.</span>&nbsp; <span class='diff-add'> if (['image/png', 'image/jpeg'].indexOf(type) < 0 && handle_inserted !== undefined) {</span>&nbsp; <span class='diff-add'> setTimeout(handle_inserted, 0);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.events.trigger('output_appended.OutputArea', [type, value, md, toinsert]);</span>&nbsp; <span class='diff-add'> return toinsert;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var append_html = function (html, md, element) {</span>&nbsp; <span class='diff-add'> var type = 'text/html';</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_html rendered_html", type);</span>&nbsp; <span class='diff-add'> this.keyboard_manager.register_events(toinsert);</span>&nbsp; <span class='diff-add'> toinsert.append(html);</span>&nbsp; <span class='diff-add'> element.append(toinsert);</span>&nbsp; <span class='diff-add'> return toinsert;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var append_markdown = function(markdown, md, element) {</span>&nbsp; <span class='diff-add'> var type = 'text/markdown';</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_markdown", type);</span>&nbsp; <span class='diff-add'> var text_and_math = mathjaxutils.remove_math(markdown);</span>&nbsp; <span class='diff-add'> var text = text_and_math[0];</span>&nbsp; <span class='diff-add'> var math = text_and_math[1];</span>&nbsp; <span class='diff-add'> marked(text, function (err, html) {</span>&nbsp; <span class='diff-add'> html = mathjaxutils.replace_math(html, math);</span>&nbsp; <span class='diff-add'> toinsert.append(html);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> element.append(toinsert);</span>&nbsp; <span class='diff-add'> return toinsert;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var append_javascript = function (js, md, element) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * We just eval the JS code, element appears in the local scope.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var type = 'application/javascript';</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_javascript", type);</span>&nbsp; <span class='diff-add'> this.keyboard_manager.register_events(toinsert);</span>&nbsp; <span class='diff-add'> element.append(toinsert);</span>&nbsp; <span class='diff-add'> // Fix for ipython/issues/5293, make sure `element` is the area which</span>&nbsp; <span class='diff-add'> // output can be inserted into at the time of JS execution.</span>&nbsp; <span class='diff-add'> element = toinsert;</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> eval(js);</span>&nbsp; <span class='diff-add'> } catch(err) {</span>&nbsp; <span class='diff-add'> console.log(err);</span>&nbsp; <span class='diff-add'> this._append_javascript_error(err, toinsert);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return toinsert;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var append_text = function (data, md, element) {</span>&nbsp; <span class='diff-add'> var type = 'text/plain';</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_text", type);</span>&nbsp; <span class='diff-add'> // escape ANSI & HTML specials in plaintext:</span>&nbsp; <span class='diff-add'> data = utils.fixConsole(data);</span>&nbsp; <span class='diff-add'> data = utils.fixCarriageReturn(data);</span>&nbsp; <span class='diff-add'> data = utils.autoLinkUrls(data);</span>&nbsp; <span class='diff-add'> // The only user content injected with this HTML call is</span>&nbsp; <span class='diff-add'> // escaped by the fixConsole() method.</span>&nbsp; <span class='diff-add'> toinsert.append($("<pre/>").html(data));</span>&nbsp; <span class='diff-add'> element.append(toinsert);</span>&nbsp; <span class='diff-add'> return toinsert;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var append_svg = function (svg_html, md, element) {</span>&nbsp; <span class='diff-add'> var type = 'image/svg+xml';</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_svg", type);</span>&nbsp; <span class='diff-add'> // Get the svg element from within the HTML.</span>&nbsp; <span class='diff-add'> var svg = $('<div />').html(svg_html).find('svg');</span>&nbsp; <span class='diff-add'> var svg_area = $('<div />');</span>&nbsp; <span class='diff-add'> var width = svg.attr('width');</span>&nbsp; <span class='diff-add'> var height = svg.attr('height');</span>&nbsp; <span class='diff-add'> svg</span>&nbsp; <span class='diff-add'> .width('100%')</span>&nbsp; <span class='diff-add'> .height('100%');</span>&nbsp; <span class='diff-add'> svg_area</span>&nbsp; <span class='diff-add'> .width(width)</span>&nbsp; <span class='diff-add'> .height(height);</span>&nbsp; <span class='diff-add'> // The jQuery resize handlers don't seem to work on the svg element.</span>&nbsp; <span class='diff-add'> // When the svg renders completely, measure it's size and set the parent</span>&nbsp; <span class='diff-add'> // div to that size. Then set the svg to 100% the size of the parent</span>&nbsp; <span class='diff-add'> // div and make the parent div resizable. </span>&nbsp; <span class='diff-add'> this._dblclick_to_reset_size(svg_area, true, false);</span>&nbsp; <span class='diff-add'> svg_area.append(svg);</span>&nbsp; <span class='diff-add'> toinsert.append(svg_area);</span>&nbsp; <span class='diff-add'> element.append(toinsert);</span>&nbsp; <span class='diff-add'> return toinsert;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype._dblclick_to_reset_size = function (img, immediately, resize_parent) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Add a resize handler to an element</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * img: jQuery element</span>&nbsp; <span class='diff-add'> * immediately: bool=False</span>&nbsp; <span class='diff-add'> * Wait for the element to load before creating the handle.</span>&nbsp; <span class='diff-add'> * resize_parent: bool=True</span>&nbsp; <span class='diff-add'> * Should the parent of the element be resized when the element is</span>&nbsp; <span class='diff-add'> * reset (by double click).</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var callback = function (){</span>&nbsp; <span class='diff-add'> var h0 = img.height();</span>&nbsp; <span class='diff-add'> var w0 = img.width();</span>&nbsp; <span class='diff-add'> if (!(h0 && w0)) {</span>&nbsp; <span class='diff-add'> // zero size, don't make it resizable</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> img.resizable({</span>&nbsp; <span class='diff-add'> aspectRatio: true,</span>&nbsp; <span class='diff-add'> autoHide: true</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> img.dblclick(function () {</span>&nbsp; <span class='diff-add'> // resize wrapper & image together for some reason:</span>&nbsp; <span class='diff-add'> img.height(h0);</span>&nbsp; <span class='diff-add'> img.width(w0);</span>&nbsp; <span class='diff-add'> if (resize_parent === undefined || resize_parent) {</span>&nbsp; <span class='diff-add'> img.parent().height(h0);</span>&nbsp; <span class='diff-add'> img.parent().width(w0);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (immediately) {</span>&nbsp; <span class='diff-add'> callback();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> img.on("load", callback);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var set_width_height = function (img, md, mime) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * set width and height of an img element from metadata</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var height = _get_metadata_key(md, 'height', mime);</span>&nbsp; <span class='diff-add'> if (height !== undefined) img.attr('height', height);</span>&nbsp; <span class='diff-add'> var width = _get_metadata_key(md, 'width', mime);</span>&nbsp; <span class='diff-add'> if (width !== undefined) img.attr('width', width);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var append_png = function (png, md, element, handle_inserted) {</span>&nbsp; <span class='diff-add'> var type = 'image/png';</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_png", type);</span>&nbsp; <span class='diff-add'> var img = $("<img/>");</span>&nbsp; <span class='diff-add'> if (handle_inserted !== undefined) {</span>&nbsp; <span class='diff-add'> img.on('load', function(){</span>&nbsp; <span class='diff-add'> handle_inserted(img);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> img[0].src = 'data:image/png;base64,'+ png;</span>&nbsp; <span class='diff-add'> set_width_height(img, md, 'image/png');</span>&nbsp; <span class='diff-add'> this._dblclick_to_reset_size(img);</span>&nbsp; <span class='diff-add'> toinsert.append(img);</span>&nbsp; <span class='diff-add'> element.append(toinsert);</span>&nbsp; <span class='diff-add'> return toinsert;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var append_jpeg = function (jpeg, md, element, handle_inserted) {</span>&nbsp; <span class='diff-add'> var type = 'image/jpeg';</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_jpeg", type);</span>&nbsp; <span class='diff-add'> var img = $("<img/>");</span>&nbsp; <span class='diff-add'> if (handle_inserted !== undefined) {</span>&nbsp; <span class='diff-add'> img.on('load', function(){</span>&nbsp; <span class='diff-add'> handle_inserted(img);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> img[0].src = 'data:image/jpeg;base64,'+ jpeg;</span>&nbsp; <span class='diff-add'> set_width_height(img, md, 'image/jpeg');</span>&nbsp; <span class='diff-add'> this._dblclick_to_reset_size(img);</span>&nbsp; <span class='diff-add'> toinsert.append(img);</span>&nbsp; <span class='diff-add'> element.append(toinsert);</span>&nbsp; <span class='diff-add'> return toinsert;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var append_pdf = function (pdf, md, element) {</span>&nbsp; <span class='diff-add'> var type = 'application/pdf';</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_pdf", type);</span>&nbsp; <span class='diff-add'> var a = $('<a/>').attr('href', 'data:application/pdf;base64,'+pdf);</span>&nbsp; <span class='diff-add'> a.attr('target', '_blank');</span>&nbsp; <span class='diff-add'> a.text('View PDF');</span>&nbsp; <span class='diff-add'> toinsert.append(a);</span>&nbsp; <span class='diff-add'> element.append(toinsert);</span>&nbsp; <span class='diff-add'> return toinsert;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var append_latex = function (latex, md, element) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * This method cannot do the typesetting because the latex first has to</span>&nbsp; <span class='diff-add'> * be on the page.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var type = 'text/latex';</span>&nbsp; <span class='diff-add'> var toinsert = this.create_output_subarea(md, "output_latex", type);</span>&nbsp; <span class='diff-add'> toinsert.append(latex);</span>&nbsp; <span class='diff-add'> element.append(toinsert);</span>&nbsp; <span class='diff-add'> return toinsert;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.append_raw_input = function (msg) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.expand();</span>&nbsp; <span class='diff-add'> var content = msg.content;</span>&nbsp; <span class='diff-add'> var area = this.create_output_area();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // disable any other raw_inputs, if they are left around</span>&nbsp; <span class='diff-add'> $("div.output_subarea.raw_input_container").remove();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var input_type = content.password ? 'password' : 'text';</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> area.append(</span>&nbsp; <span class='diff-add'> $("<div/>")</span>&nbsp; <span class='diff-add'> .addClass("box-flex1 output_subarea raw_input_container")</span>&nbsp; <span class='diff-add'> .append(</span>&nbsp; <span class='diff-add'> $("<span/>")</span>&nbsp; <span class='diff-add'> .addClass("raw_input_prompt")</span>&nbsp; <span class='diff-add'> .text(content.prompt)</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> .append(</span>&nbsp; <span class='diff-add'> $("<input/>")</span>&nbsp; <span class='diff-add'> .addClass("raw_input")</span>&nbsp; <span class='diff-add'> .attr('type', input_type)</span>&nbsp; <span class='diff-add'> .attr("size", 47)</span>&nbsp; <span class='diff-add'> .keydown(function (event, ui) {</span>&nbsp; <span class='diff-add'> // make sure we submit on enter,</span>&nbsp; <span class='diff-add'> // and don't re-execute the *cell* on shift-enter</span>&nbsp; <span class='diff-add'> if (event.which === keyboard.keycodes.enter) {</span>&nbsp; <span class='diff-add'> that._submit_raw_input();</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> })</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.element.append(area);</span>&nbsp; <span class='diff-add'> var raw_input = area.find('input.raw_input');</span>&nbsp; <span class='diff-add'> // Register events that enable/disable the keyboard manager while raw</span>&nbsp; <span class='diff-add'> // input is focused.</span>&nbsp; <span class='diff-add'> this.keyboard_manager.register_events(raw_input);</span>&nbsp; <span class='diff-add'> // Note, the following line used to read raw_input.focus().focus().</span>&nbsp; <span class='diff-add'> // This seemed to be needed otherwise only the cell would be focused.</span>&nbsp; <span class='diff-add'> // But with the modal UI, this seems to work fine with one call to focus().</span>&nbsp; <span class='diff-add'> raw_input.focus();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype._submit_raw_input = function (evt) {</span>&nbsp; <span class='diff-add'> var container = this.element.find("div.raw_input_container");</span>&nbsp; <span class='diff-add'> var theprompt = container.find("span.raw_input_prompt");</span>&nbsp; <span class='diff-add'> var theinput = container.find("input.raw_input");</span>&nbsp; <span class='diff-add'> var value = theinput.val();</span>&nbsp; <span class='diff-add'> var echo = value;</span>&nbsp; <span class='diff-add'> // don't echo if it's a password</span>&nbsp; <span class='diff-add'> if (theinput.attr('type') == 'password') {</span>&nbsp; <span class='diff-add'> echo = '········';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var content = {</span>&nbsp; <span class='diff-add'> output_type : 'stream',</span>&nbsp; <span class='diff-add'> name : 'stdout',</span>&nbsp; <span class='diff-add'> text : theprompt.text() + echo + '\n'</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // remove form container</span>&nbsp; <span class='diff-add'> container.parent().remove();</span>&nbsp; <span class='diff-add'> // replace with plaintext version in stdout</span>&nbsp; <span class='diff-add'> this.append_output(content, false);</span>&nbsp; <span class='diff-add'> this.events.trigger('send_input_reply.Kernel', value);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.handle_clear_output = function (msg) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * msg spec v4 had stdout, stderr, display keys</span>&nbsp; <span class='diff-add'> * v4.1 replaced these with just wait</span>&nbsp; <span class='diff-add'> * The default behavior is the same (stdout=stderr=display=True, wait=False),</span>&nbsp; <span class='diff-add'> * so v4 messages will still be properly handled,</span>&nbsp; <span class='diff-add'> * except for the rarely used clearing less than all output.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.clear_output(msg.content.wait || false);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.clear_output = function(wait, ignore_que) {</span>&nbsp; <span class='diff-add'> if (wait) {</span>&nbsp; <span class='diff-add'> // If a clear is queued, clear before adding another to the queue.</span>&nbsp; <span class='diff-add'> if (this.clear_queued) {</span>&nbsp; <span class='diff-add'> this.clear_output(false);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.clear_queued = true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // Fix the output div's height if the clear_output is waiting for</span>&nbsp; <span class='diff-add'> // new output (it is being used in an animation).</span>&nbsp; <span class='diff-add'> if (!ignore_que && this.clear_queued) {</span>&nbsp; <span class='diff-add'> var height = this.element.height();</span>&nbsp; <span class='diff-add'> this.element.height(height);</span>&nbsp; <span class='diff-add'> this.clear_queued = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Clear all</span>&nbsp; <span class='diff-add'> // Remove load event handlers from img tags because we don't want</span>&nbsp; <span class='diff-add'> // them to fire if the image is never added to the page.</span>&nbsp; <span class='diff-add'> this.element.find('img').off('load');</span>&nbsp; <span class='diff-add'> this.element.html("");</span>&nbsp; <span class='diff-add'> // Notify others of changes.</span>&nbsp; <span class='diff-add'> this.element.trigger('changed');</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.outputs = [];</span>&nbsp; <span class='diff-add'> this.trusted = true;</span>&nbsp; <span class='diff-add'> this.unscroll_area();</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // JSON serialization</span>&nbsp; <span class='diff-add'> OutputArea.prototype.fromJSON = function (outputs, metadata) {</span>&nbsp; <span class='diff-add'> var len = outputs.length;</span>&nbsp; <span class='diff-add'> metadata = metadata || {};</span>&nbsp; <span class='diff-add'> for (var i=0; i<len; i++) {</span>&nbsp; <span class='diff-add'> this.append_output(outputs[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (metadata.collapsed !== undefined) {</span>&nbsp; <span class='diff-add'> if (metadata.collapsed) {</span>&nbsp; <span class='diff-add'> this.collapse();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.expand();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (metadata.scrolled !== undefined) {</span>&nbsp; <span class='diff-add'> this.scroll_state = metadata.scrolled;</span>&nbsp; <span class='diff-add'> if (metadata.scrolled) {</span>&nbsp; <span class='diff-add'> this.scroll_if_long();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.unscroll_area();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> OutputArea.prototype.toJSON = function () {</span>&nbsp; <span class='diff-add'> return this.outputs;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Class properties</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Threshold to trigger autoscroll when the OutputArea is resized,</span>&nbsp; <span class='diff-add'> * typically when new outputs are added.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Behavior is undefined if autoscroll is lower than minimum_scroll_threshold,</span>&nbsp; <span class='diff-add'> * unless it is < 0, in which case autoscroll will never be triggered</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @property auto_scroll_threshold</span>&nbsp; <span class='diff-add'> * @type Number</span>&nbsp; <span class='diff-add'> * @default 100</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> OutputArea.auto_scroll_threshold = 100;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Lower limit (in lines) for OutputArea to be made scrollable. OutputAreas</span>&nbsp; <span class='diff-add'> * shorter than this are never scrolled.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @property minimum_scroll_threshold</span>&nbsp; <span class='diff-add'> * @type Number</span>&nbsp; <span class='diff-add'> * @default 20</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> **/</span>&nbsp; <span class='diff-add'> OutputArea.minimum_scroll_threshold = 20;</span>&nbsp; <span class='diff-add'> OutputArea.display_order = [</span>&nbsp; <span class='diff-add'> 'application/javascript',</span>&nbsp; <span class='diff-add'> 'text/html',</span>&nbsp; <span class='diff-add'> 'text/markdown',</span>&nbsp; <span class='diff-add'> 'text/latex',</span>&nbsp; <span class='diff-add'> 'image/svg+xml',</span>&nbsp; <span class='diff-add'> 'image/png',</span>&nbsp; <span class='diff-add'> 'image/jpeg',</span>&nbsp; <span class='diff-add'> 'application/pdf',</span>&nbsp; <span class='diff-add'> 'text/plain'</span>&nbsp; <span class='diff-add'> ];</span>&nbsp; <span class='diff-add'> OutputArea.append_map = {</span>&nbsp; <span class='diff-add'> "text/plain" : append_text,</span>&nbsp; <span class='diff-add'> "text/html" : append_html,</span>&nbsp; <span class='diff-add'> "text/markdown": append_markdown,</span>&nbsp; <span class='diff-add'> "image/svg+xml" : append_svg,</span>&nbsp; <span class='diff-add'> "image/png" : append_png,</span>&nbsp; <span class='diff-add'> "image/jpeg" : append_jpeg,</span>&nbsp; <span class='diff-add'> "text/latex" : append_latex,</span>&nbsp; <span class='diff-add'> "application/javascript" : append_javascript,</span>&nbsp; <span class='diff-add'> "application/pdf" : append_pdf</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // For backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.OutputArea = OutputArea;</span>&nbsp; <span class='diff-add'> return {'OutputArea': OutputArea};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/overlay.js b/ipynb/Array-feature-overlap-05_files/overlay.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..e1b9ed3</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/overlay.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>// Utility function that allows modes to be combined. The mode given</span>&nbsp; <span class='diff-add'>// as the base argument takes care of most of the normal mode</span>&nbsp; <span class='diff-add'>// functionality, but a second (typically simple) mode is used, which</span>&nbsp; <span class='diff-add'>// can override the style of text. Both modes get to parse all of the</span>&nbsp; <span class='diff-add'>// text, but when both assign a non-null style to a piece of code, the</span>&nbsp; <span class='diff-add'>// overlay wins, unless the combine argument was true and not overridden,</span>&nbsp; <span class='diff-add'>// or state.overlay.combineTokens was true, in which case the styles are</span>&nbsp; <span class='diff-add'>// combined.</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../../lib/codemirror"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../../lib/codemirror"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'>"use strict";</span>&nbsp; <span class='diff-add'>CodeMirror.overlayMode = function(base, overlay, combine) {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> startState: function() {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> base: CodeMirror.startState(base),</span>&nbsp; <span class='diff-add'> overlay: CodeMirror.startState(overlay),</span>&nbsp; <span class='diff-add'> basePos: 0, baseCur: null,</span>&nbsp; <span class='diff-add'> overlayPos: 0, overlayCur: null,</span>&nbsp; <span class='diff-add'> streamSeen: null</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> copyState: function(state) {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> base: CodeMirror.copyState(base, state.base),</span>&nbsp; <span class='diff-add'> overlay: CodeMirror.copyState(overlay, state.overlay),</span>&nbsp; <span class='diff-add'> basePos: state.basePos, baseCur: null,</span>&nbsp; <span class='diff-add'> overlayPos: state.overlayPos, overlayCur: null</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> token: function(stream, state) {</span>&nbsp; <span class='diff-add'> if (stream != state.streamSeen ||</span>&nbsp; <span class='diff-add'> Math.min(state.basePos, state.overlayPos) < stream.start) {</span>&nbsp; <span class='diff-add'> state.streamSeen = stream;</span>&nbsp; <span class='diff-add'> state.basePos = state.overlayPos = stream.start;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (stream.start == state.basePos) {</span>&nbsp; <span class='diff-add'> state.baseCur = base.token(stream, state.base);</span>&nbsp; <span class='diff-add'> state.basePos = stream.pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (stream.start == state.overlayPos) {</span>&nbsp; <span class='diff-add'> stream.pos = stream.start;</span>&nbsp; <span class='diff-add'> state.overlayCur = overlay.token(stream, state.overlay);</span>&nbsp; <span class='diff-add'> state.overlayPos = stream.pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> stream.pos = Math.min(state.basePos, state.overlayPos);</span>&nbsp; <span class='diff-add'> // state.overlay.combineTokens always takes precedence over combine,</span>&nbsp; <span class='diff-add'> // unless set to null</span>&nbsp; <span class='diff-add'> if (state.overlayCur == null) return state.baseCur;</span>&nbsp; <span class='diff-add'> else if (state.baseCur != null &&</span>&nbsp; <span class='diff-add'> state.overlay.combineTokens ||</span>&nbsp; <span class='diff-add'> combine && state.overlay.combineTokens == null)</span>&nbsp; <span class='diff-add'> return state.baseCur + " " + state.overlayCur;</span>&nbsp; <span class='diff-add'> else return state.overlayCur;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> indent: base.indent && function(state, textAfter) {</span>&nbsp; <span class='diff-add'> return base.indent(state.base, textAfter);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> electricChars: base.electricChars,</span>&nbsp; <span class='diff-add'> innerMode: function(state) { return {state: state.base, mode: base}; },</span>&nbsp; <span class='diff-add'> blankLine: function(state) {</span>&nbsp; <span class='diff-add'> if (base.blankLine) base.blankLine(state.base);</span>&nbsp; <span class='diff-add'> if (overlay.blankLine) overlay.blankLine(state.overlay);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/override.css b/ipynb/Array-feature-overlap-05_files/override.css</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..117fb7c</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/override.css</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*This file contains any manual css for this page that needs to override the global styles.</span>&nbsp; <span class='diff-add'>This is only required when different pages style the same element differently. This is just</span>&nbsp; <span class='diff-add'>a hack to deal with our current css styles and no new styling should be added in this file.*/</span>&nbsp; <span class='diff-add'>#ipython-main-app {</span>&nbsp; <span class='diff-add'> position: relative;</span>&nbsp; <span class='diff-add'>}</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/page.js b/ipynb/Array-feature-overlap-05_files/page.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..ea35027</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/page.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/events',</span>&nbsp; <span class='diff-add'>], function(IPython, $, events){</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var Page = function () {</span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Page.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> // resize site on:</span>&nbsp; <span class='diff-add'> // - window resize</span>&nbsp; <span class='diff-add'> // - header change</span>&nbsp; <span class='diff-add'> // - page load</span>&nbsp; <span class='diff-add'> var _handle_resize = $.proxy(this._resize_site, this);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> $(window).resize(_handle_resize);</span>&nbsp; <span class='diff-add'> // On document ready, resize codemirror.</span>&nbsp; <span class='diff-add'> $(document).ready(_handle_resize);</span>&nbsp; <span class='diff-add'> events.on('resize-header.Page', _handle_resize);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Page.prototype.show = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * The header and site divs start out hidden to prevent FLOUC.</span>&nbsp; <span class='diff-add'> * Main scripts should call this method after styling everything.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.show_header();</span>&nbsp; <span class='diff-add'> this.show_site();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Page.prototype.show_header = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * The header and site divs start out hidden to prevent FLOUC.</span>&nbsp; <span class='diff-add'> * Main scripts should call this method after styling everything.</span>&nbsp; <span class='diff-add'> * TODO: selector are hardcoded, pass as constructor argument</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> $('div#header').css('display','block');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Page.prototype.show_site = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * The header and site divs start out hidden to prevent FLOUC.</span>&nbsp; <span class='diff-add'> * Main scripts should call this method after styling everything.</span>&nbsp; <span class='diff-add'> * TODO: selector are hardcoded, pass as constructor argument</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> $('div#site').css('display', 'block');</span>&nbsp; <span class='diff-add'> this._resize_site();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Page.prototype._resize_site = function() {</span>&nbsp; <span class='diff-add'> // Update the site's size.</span>&nbsp; <span class='diff-add'> $('div#site').height(window.innerHeight - $('#header').height());</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Register self in the global namespace for convenience.</span>&nbsp; <span class='diff-add'> IPython.Page = Page;</span>&nbsp; <span class='diff-add'> return {'Page': Page};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/pager.js b/ipynb/Array-feature-overlap-05_files/pager.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..881d575</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/pager.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jqueryui',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var Pager = function (pager_selector, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters:</span>&nbsp; <span class='diff-add'> * pager_selector: string</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> * events: $(Events) instance</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.events = options.events;</span>&nbsp; <span class='diff-add'> this.pager_element = $(pager_selector);</span>&nbsp; <span class='diff-add'> this.pager_button_area = $('#pager-button-area');</span>&nbsp; <span class='diff-add'> this._default_end_space = 100;</span>&nbsp; <span class='diff-add'> this.pager_element.resizable({handles: 'n', resize: $.proxy(this._resize, this)});</span>&nbsp; <span class='diff-add'> this.expanded = false;</span>&nbsp; <span class='diff-add'> this.create_button_area();</span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Pager.prototype.create_button_area = function(){</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.pager_button_area.append(</span>&nbsp; <span class='diff-add'> $('<a>').attr('role', "button")</span>&nbsp; <span class='diff-add'> .attr('title',"Open the pager in an external window")</span>&nbsp; <span class='diff-add'> .addClass('ui-button')</span>&nbsp; <span class='diff-add'> .click(function(){that.detach();})</span>&nbsp; <span class='diff-add'> .append(</span>&nbsp; <span class='diff-add'> $('<span>').addClass("ui-icon ui-icon-extlink")</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> this.pager_button_area.append(</span>&nbsp; <span class='diff-add'> $('<a>').attr('role', "button")</span>&nbsp; <span class='diff-add'> .attr('title',"Close the pager")</span>&nbsp; <span class='diff-add'> .addClass('ui-button')</span>&nbsp; <span class='diff-add'> .click(function(){that.collapse();})</span>&nbsp; <span class='diff-add'> .append(</span>&nbsp; <span class='diff-add'> $('<span>').addClass("ui-icon ui-icon-close")</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Pager.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.pager_element.bind('collapse_pager', function (event, extrap) {</span>&nbsp; <span class='diff-add'> // Animate hiding of the pager.</span>&nbsp; <span class='diff-add'> var time = (extrap && extrap.duration) ? extrap.duration : 'fast';</span>&nbsp; <span class='diff-add'> that.pager_element.animate({</span>&nbsp; <span class='diff-add'> height: 'toggle'</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> duration: time,</span>&nbsp; <span class='diff-add'> done: function() {</span>&nbsp; <span class='diff-add'> $('.end_space').css('height', that._default_end_space);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.pager_element.bind('expand_pager', function (event, extrap) {</span>&nbsp; <span class='diff-add'> // Clear the pager's height attr if it's set. This allows the</span>&nbsp; <span class='diff-add'> // pager to size itself according to its contents.</span>&nbsp; <span class='diff-add'> that.pager_element.height('initial');</span>&nbsp; <span class='diff-add'> // Animate the showing of the pager</span>&nbsp; <span class='diff-add'> var time = (extrap && extrap.duration) ? extrap.duration : 'fast';</span>&nbsp; <span class='diff-add'> that.pager_element.show(time, function() {</span>&nbsp; <span class='diff-add'> // Explicitly set pager height once the pager has shown itself.</span>&nbsp; <span class='diff-add'> // This allows the pager-contents div to use percentage sizing.</span>&nbsp; <span class='diff-add'> that.pager_element.height(that.pager_element.height());</span>&nbsp; <span class='diff-add'> that._resize();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('open_with_text.Pager', function (event, payload) {</span>&nbsp; <span class='diff-add'> // FIXME: support other mime types</span>&nbsp; <span class='diff-add'> if (payload.data['text/plain'] && payload.data['text/plain'] !== "") {</span>&nbsp; <span class='diff-add'> that.clear();</span>&nbsp; <span class='diff-add'> that.expand();</span>&nbsp; <span class='diff-add'> that.append_text(payload.data['text/plain']);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Pager.prototype.collapse = function (extrap) {</span>&nbsp; <span class='diff-add'> if (this.expanded === true) {</span>&nbsp; <span class='diff-add'> this.expanded = false;</span>&nbsp; <span class='diff-add'> this.pager_element.trigger('collapse_pager', extrap);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Pager.prototype.expand = function (extrap) {</span>&nbsp; <span class='diff-add'> if (this.expanded !== true) {</span>&nbsp; <span class='diff-add'> this.expanded = true;</span>&nbsp; <span class='diff-add'> this.pager_element.trigger('expand_pager', extrap);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Pager.prototype.toggle = function () {</span>&nbsp; <span class='diff-add'> if (this.expanded === true) {</span>&nbsp; <span class='diff-add'> this.collapse();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.expand();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Pager.prototype.clear = function (text) {</span>&nbsp; <span class='diff-add'> this.pager_element.find(".container").empty();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Pager.prototype.detach = function(){</span>&nbsp; <span class='diff-add'> var w = window.open("","_blank");</span>&nbsp; <span class='diff-add'> $(w.document.head)</span>&nbsp; <span class='diff-add'> .append(</span>&nbsp; <span class='diff-add'> $('<link>')</span>&nbsp; <span class='diff-add'> .attr('rel',"stylesheet")</span>&nbsp; <span class='diff-add'> .attr('href',"/static/css/notebook.css")</span>&nbsp; <span class='diff-add'> .attr('type',"text/css")</span>&nbsp; <span class='diff-add'> )</span>&nbsp; <span class='diff-add'> .append(</span>&nbsp; <span class='diff-add'> $('<title>').text("IPython Pager")</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> var pager_body = $(w.document.body);</span>&nbsp; <span class='diff-add'> pager_body.css('overflow','scroll');</span>&nbsp; <span class='diff-add'> pager_body.append(this.pager_element.clone().children());</span>&nbsp; <span class='diff-add'> w.document.close();</span>&nbsp; <span class='diff-add'> this.collapse();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Pager.prototype.append_text = function (text) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * The only user content injected with this HTML call is escaped by</span>&nbsp; <span class='diff-add'> * the fixConsole() method.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.pager_element.find(".container").append($('<pre/>').html(utils.fixCarriageReturn(utils.fixConsole(text))));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Pager.prototype._resize = function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update document based on pager size.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Make sure the padding at the end of the notebook is large</span>&nbsp; <span class='diff-add'> // enough that the user can scroll to the bottom of the </span>&nbsp; <span class='diff-add'> // notebook.</span>&nbsp; <span class='diff-add'> $('.end_space').css('height', Math.max(this.pager_element.height(), this._default_end_space));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.Pager = Pager;</span>&nbsp; <span class='diff-add'> return {'Pager': Pager};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/promise.min.js b/ipynb/Array-feature-overlap-05_files/promise.min.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..8c87983</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/promise.min.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>!function(){var a,b,c,d;!function(){var e={},f={};a=function(a,b,c){e[a]={deps:b,callback:c}},d=c=b=function(a){function c(b){if("."!==b.charAt(0))return b;for(var c=b.split("/"),d=a.split("/").slice(0,-1),e=0,f=c.length;f>e;e++){var g=c[e];if(".."===g)d.pop();else{if("."===g)continue;d.push(g)}}return d.join("/")}if(d._eak_seen=e,f[a])return f[a];if(f[a]={},!e[a])throw new Error("Could not find module "+a);for(var g,h=e[a],i=h.deps,j=h.callback,k=[],l=0,m=i.length;m>l;l++)"exports"===i[l]?k.push(g={}):k.push(b(c(i[l])));var n=j.apply(this,k);return f[a]=g||n}}(),a("promise/all",["./utils","exports"],function(a,b){"use strict";function c(a){var b=this;if(!d(a))throw new TypeError("You must pass an array to all.");return new b(function(b,c){function d(a){return function(b){f(a,b)}}function f(a,c){h[a]=c,0===--i&&b(h)}var g,h=[],i=a.length;0===i&&b([]);for(var j=0;j<a.length;j++)g=a[j],g&&e(g.then)?g.then(d(j),c):f(j,g)})}var d=a.isArray,e=a.isFunction;b.all=c}),a("promise/asap",["exports"],function(a){"use strict";function b(){return function(){process.nextTick(e)}}function c(){var a=0,b=new i(e),c=document.createTextNode("");return b.observe(c,{characterData:!0}),function(){c.data=a=++a%2}}function d(){return function(){j.setTimeout(e,1)}}function e(){for(var a=0;a<k.length;a++){var b=k[a],c=b[0],d=b[1];c(d)}k=[]}function f(a,b){var c=k.push([a,b]);1===c&&g()}var g,h="undefined"!=typeof window?window:{},i=h.MutationObserver||h.WebKitMutationObserver,j="undefined"!=typeof global?global:void 0===this?window:this,k=[];g="undefined"!=typeof process&&"[object process]"==={}.toString.call(process)?b():i?c():d(),a.asap=f}),a("promise/config",["exports"],function(a){"use strict";function b(a,b){return 2!==arguments.length?c[a]:(c[a]=b,void 0)}var c={instrument:!1};a.config=c,a.configure=b}),a("promise/polyfill",["./promise","./utils","exports"],function(a,b,c){"use strict";function d(){var a;a="undefined"!=typeof global?global:"undefined"!=typeof window&&window.document?window:self;var b="Promise"in a&&"resolve"in a.Promise&&"reject"in a.Promise&&"all"in a.Promise&&"race"in a.Promise&&function(){var b;return new a.Promise(function(a){b=a}),f(b)}();b||(a.Promise=e)}var e=a.Promise,f=b.isFunction;c.polyfill=d}),a("promise/promise",["./config","./utils","./all","./race","./resolve","./reject","./asap","exports"],function(a,b,c,d,e,f,g,h){"use strict";function i(a){if(!v(a))throw new TypeError("You must pass a resolver function as the first argument to the promise constructor");if(!(this instanceof i))throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");this._subscribers=[],j(a,this)}function j(a,b){function c(a){o(b,a)}function d(a){q(b,a)}try{a(c,d)}catch(e){d(e)}}function k(a,b,c,d){var e,f,g,h,i=v(c);if(i)try{e=c(d),g=!0}catch(j){h=!0,f=j}else e=d,g=!0;n(b,e)||(i&&g?o(b,e):h?q(b,f):a===D?o(b,e):a===E&&q(b,e))}function l(a,b,c,d){var e=a._subscribers,f=e.length;e[f]=b,e[f+D]=c,e[f+E]=d}function m(a,b){for(var c,d,e=a._subscribers,f=a._detail,g=0;g<e.length;g+=3)c=e[g],d=e[g+b],k(b,c,d,f);a._subscribers=null}function n(a,b){var c,d=null;try{if(a===b)throw new TypeError("A promises callback cannot return that same promise.");if(u(b)&&(d=b.then,v(d)))return d.call(b,function(d){return c?!0:(c=!0,b!==d?o(a,d):p(a,d),void 0)},function(b){return c?!0:(c=!0,q(a,b),void 0)}),!0}catch(e){return c?!0:(q(a,e),!0)}return!1}function o(a,b){a===b?p(a,b):n(a,b)||p(a,b)}function p(a,b){a._state===B&&(a._state=C,a._detail=b,t.async(r,a))}function q(a,b){a._state===B&&(a._state=C,a._detail=b,t.async(s,a))}function r(a){m(a,a._state=D)}function s(a){m(a,a._state=E)}var t=a.config,u=(a.configure,b.objectOrFunction),v=b.isFunction,w=(b.now,c.all),x=d.race,y=e.resolve,z=f.reject,A=g.asap;t.async=A;var B=void 0,C=0,D=1,E=2;i.prototype={constructor:i,_state:void 0,_detail:void 0,_subscribers:void 0,then:function(a,b){var c=this,d=new this.constructor(function(){});if(this._state){var e=arguments;t.async(function(){k(c._state,d,e[c._state-1],c._detail)})}else l(this,d,a,b);return d},"catch":function(a){return this.then(null,a)}},i.all=w,i.race=x,i.resolve=y,i.reject=z,h.Promise=i}),a("promise/race",["./utils","exports"],function(a,b){"use strict";function c(a){var b=this;if(!d(a))throw new TypeError("You must pass an array to race.");return new b(function(b,c){for(var d,e=0;e<a.length;e++)d=a[e],d&&"function"==typeof d.then?d.then(b,c):b(d)})}var d=a.isArray;b.race=c}),a("promise/reject",["exports"],function(a){"use strict";function b(a){var b=this;return new b(function(b,c){c(a)})}a.reject=b}),a("promise/resolve",["exports"],function(a){"use strict";function b(a){if(a&&"object"==typeof a&&a.constructor===this)return a;var b=this;return new b(function(b){b(a)})}a.resolve=b}),a("promise/utils",["exports"],function(a){"use strict";function b(a){return c(a)||"object"==typeof a&&null!==a}function c(a){return"function"==typeof a}function d(a){return"[object Array]"===Object.prototype.toString.call(a)}var e=Date.now||function(){return(new Date).getTime()};a.objectOrFunction=b,a.isFunction=c,a.isArray=d,a.now=e}),b("promise/polyfill").polyfill()}();</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/python.js b/ipynb/Array-feature-overlap-05_files/python.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..98c0409</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/python.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../../lib/codemirror"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../../lib/codemirror"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> function wordRegexp(words) {</span>&nbsp; <span class='diff-add'> return new RegExp("^((" + words.join(")|(") + "))\\b");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var wordOperators = wordRegexp(["and", "or", "not", "is"]);</span>&nbsp; <span class='diff-add'> var commonKeywords = ["as", "assert", "break", "class", "continue",</span>&nbsp; <span class='diff-add'> "def", "del", "elif", "else", "except", "finally",</span>&nbsp; <span class='diff-add'> "for", "from", "global", "if", "import",</span>&nbsp; <span class='diff-add'> "lambda", "pass", "raise", "return",</span>&nbsp; <span class='diff-add'> "try", "while", "with", "yield", "in"];</span>&nbsp; <span class='diff-add'> var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr",</span>&nbsp; <span class='diff-add'> "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod",</span>&nbsp; <span class='diff-add'> "enumerate", "eval", "filter", "float", "format", "frozenset",</span>&nbsp; <span class='diff-add'> "getattr", "globals", "hasattr", "hash", "help", "hex", "id",</span>&nbsp; <span class='diff-add'> "input", "int", "isinstance", "issubclass", "iter", "len",</span>&nbsp; <span class='diff-add'> "list", "locals", "map", "max", "memoryview", "min", "next",</span>&nbsp; <span class='diff-add'> "object", "oct", "open", "ord", "pow", "property", "range",</span>&nbsp; <span class='diff-add'> "repr", "reversed", "round", "set", "setattr", "slice",</span>&nbsp; <span class='diff-add'> "sorted", "staticmethod", "str", "sum", "super", "tuple",</span>&nbsp; <span class='diff-add'> "type", "vars", "zip", "__import__", "NotImplemented",</span>&nbsp; <span class='diff-add'> "Ellipsis", "__debug__"];</span>&nbsp; <span class='diff-add'> var py2 = {builtins: ["apply", "basestring", "buffer", "cmp", "coerce", "execfile",</span>&nbsp; <span class='diff-add'> "file", "intern", "long", "raw_input", "reduce", "reload",</span>&nbsp; <span class='diff-add'> "unichr", "unicode", "xrange", "False", "True", "None"],</span>&nbsp; <span class='diff-add'> keywords: ["exec", "print"]};</span>&nbsp; <span class='diff-add'> var py3 = {builtins: ["ascii", "bytes", "exec", "print"],</span>&nbsp; <span class='diff-add'> keywords: ["nonlocal", "False", "True", "None"]};</span>&nbsp; <span class='diff-add'> CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins));</span>&nbsp; <span class='diff-add'> function top(state) {</span>&nbsp; <span class='diff-add'> return state.scopes[state.scopes.length - 1];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> CodeMirror.defineMode("python", function(conf, parserConf) {</span>&nbsp; <span class='diff-add'> var ERRORCLASS = "error";</span>&nbsp; <span class='diff-add'> var singleDelimiters = parserConf.singleDelimiters || new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]");</span>&nbsp; <span class='diff-add'> var doubleOperators = parserConf.doubleOperators || new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))");</span>&nbsp; <span class='diff-add'> var doubleDelimiters = parserConf.doubleDelimiters || new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))");</span>&nbsp; <span class='diff-add'> var tripleDelimiters = parserConf.tripleDelimiters || new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");</span>&nbsp; <span class='diff-add'> if (parserConf.version && parseInt(parserConf.version, 10) == 3){</span>&nbsp; <span class='diff-add'> // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator</span>&nbsp; <span class='diff-add'> var singleOperators = parserConf.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!@]");</span>&nbsp; <span class='diff-add'> var identifiers = parserConf.identifiers|| new RegExp("^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*");</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var singleOperators = parserConf.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!]");</span>&nbsp; <span class='diff-add'> var identifiers = parserConf.identifiers|| new RegExp("^[_A-Za-z][_A-Za-z0-9]*");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var hangingIndent = parserConf.hangingIndent || conf.indentUnit;</span>&nbsp; <span class='diff-add'> var myKeywords = commonKeywords, myBuiltins = commonBuiltins;</span>&nbsp; <span class='diff-add'> if(parserConf.extra_keywords != undefined){</span>&nbsp; <span class='diff-add'> myKeywords = myKeywords.concat(parserConf.extra_keywords);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if(parserConf.extra_builtins != undefined){</span>&nbsp; <span class='diff-add'> myBuiltins = myBuiltins.concat(parserConf.extra_builtins);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (parserConf.version && parseInt(parserConf.version, 10) == 3) {</span>&nbsp; <span class='diff-add'> myKeywords = myKeywords.concat(py3.keywords);</span>&nbsp; <span class='diff-add'> myBuiltins = myBuiltins.concat(py3.builtins);</span>&nbsp; <span class='diff-add'> var stringPrefixes = new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))", "i");</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> myKeywords = myKeywords.concat(py2.keywords);</span>&nbsp; <span class='diff-add'> myBuiltins = myBuiltins.concat(py2.builtins);</span>&nbsp; <span class='diff-add'> var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var keywords = wordRegexp(myKeywords);</span>&nbsp; <span class='diff-add'> var builtins = wordRegexp(myBuiltins);</span>&nbsp; <span class='diff-add'> // tokenizers</span>&nbsp; <span class='diff-add'> function tokenBase(stream, state) {</span>&nbsp; <span class='diff-add'> // Handle scope changes</span>&nbsp; <span class='diff-add'> if (stream.sol() && top(state).type == "py") {</span>&nbsp; <span class='diff-add'> var scopeOffset = top(state).offset;</span>&nbsp; <span class='diff-add'> if (stream.eatSpace()) {</span>&nbsp; <span class='diff-add'> var lineOffset = stream.indentation();</span>&nbsp; <span class='diff-add'> if (lineOffset > scopeOffset)</span>&nbsp; <span class='diff-add'> pushScope(stream, state, "py");</span>&nbsp; <span class='diff-add'> else if (lineOffset < scopeOffset && dedent(stream, state))</span>&nbsp; <span class='diff-add'> state.errorToken = true;</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var style = tokenBaseInner(stream, state);</span>&nbsp; <span class='diff-add'> if (scopeOffset > 0 && dedent(stream, state))</span>&nbsp; <span class='diff-add'> style += " " + ERRORCLASS;</span>&nbsp; <span class='diff-add'> return style;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return tokenBaseInner(stream, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function tokenBaseInner(stream, state) {</span>&nbsp; <span class='diff-add'> if (stream.eatSpace()) return null;</span>&nbsp; <span class='diff-add'> var ch = stream.peek();</span>&nbsp; <span class='diff-add'> // Handle Comments</span>&nbsp; <span class='diff-add'> if (ch == "#") {</span>&nbsp; <span class='diff-add'> stream.skipToEnd();</span>&nbsp; <span class='diff-add'> return "comment";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Handle Number Literals</span>&nbsp; <span class='diff-add'> if (stream.match(/^[0-9\.]/, false)) {</span>&nbsp; <span class='diff-add'> var floatLiteral = false;</span>&nbsp; <span class='diff-add'> // Floats</span>&nbsp; <span class='diff-add'> if (stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; }</span>&nbsp; <span class='diff-add'> if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; }</span>&nbsp; <span class='diff-add'> if (stream.match(/^\.\d+/)) { floatLiteral = true; }</span>&nbsp; <span class='diff-add'> if (floatLiteral) {</span>&nbsp; <span class='diff-add'> // Float literals may be "imaginary"</span>&nbsp; <span class='diff-add'> stream.eat(/J/i);</span>&nbsp; <span class='diff-add'> return "number";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Integers</span>&nbsp; <span class='diff-add'> var intLiteral = false;</span>&nbsp; <span class='diff-add'> // Hex</span>&nbsp; <span class='diff-add'> if (stream.match(/^0x[0-9a-f]+/i)) intLiteral = true;</span>&nbsp; <span class='diff-add'> // Binary</span>&nbsp; <span class='diff-add'> if (stream.match(/^0b[01]+/i)) intLiteral = true;</span>&nbsp; <span class='diff-add'> // Octal</span>&nbsp; <span class='diff-add'> if (stream.match(/^0o[0-7]+/i)) intLiteral = true;</span>&nbsp; <span class='diff-add'> // Decimal</span>&nbsp; <span class='diff-add'> if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) {</span>&nbsp; <span class='diff-add'> // Decimal literals may be "imaginary"</span>&nbsp; <span class='diff-add'> stream.eat(/J/i);</span>&nbsp; <span class='diff-add'> // TODO - Can you have imaginary longs?</span>&nbsp; <span class='diff-add'> intLiteral = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Zero by itself with no other piece of number.</span>&nbsp; <span class='diff-add'> if (stream.match(/^0(?![\dx])/i)) intLiteral = true;</span>&nbsp; <span class='diff-add'> if (intLiteral) {</span>&nbsp; <span class='diff-add'> // Integer literals may be "long"</span>&nbsp; <span class='diff-add'> stream.eat(/L/i);</span>&nbsp; <span class='diff-add'> return "number";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Handle Strings</span>&nbsp; <span class='diff-add'> if (stream.match(stringPrefixes)) {</span>&nbsp; <span class='diff-add'> state.tokenize = tokenStringFactory(stream.current());</span>&nbsp; <span class='diff-add'> return state.tokenize(stream, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Handle operators and Delimiters</span>&nbsp; <span class='diff-add'> if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters))</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> if (stream.match(doubleOperators)</span>&nbsp; <span class='diff-add'> || stream.match(singleOperators)</span>&nbsp; <span class='diff-add'> || stream.match(wordOperators))</span>&nbsp; <span class='diff-add'> return "operator";</span>&nbsp; <span class='diff-add'> if (stream.match(singleDelimiters))</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> if (stream.match(keywords))</span>&nbsp; <span class='diff-add'> return "keyword";</span>&nbsp; <span class='diff-add'> if (stream.match(builtins))</span>&nbsp; <span class='diff-add'> return "builtin";</span>&nbsp; <span class='diff-add'> if (stream.match(/^(self|cls)\b/))</span>&nbsp; <span class='diff-add'> return "variable-2";</span>&nbsp; <span class='diff-add'> if (stream.match(identifiers)) {</span>&nbsp; <span class='diff-add'> if (state.lastToken == "def" || state.lastToken == "class")</span>&nbsp; <span class='diff-add'> return "def";</span>&nbsp; <span class='diff-add'> return "variable";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Handle non-detected items</span>&nbsp; <span class='diff-add'> stream.next();</span>&nbsp; <span class='diff-add'> return ERRORCLASS;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function tokenStringFactory(delimiter) {</span>&nbsp; <span class='diff-add'> while ("rub".indexOf(delimiter.charAt(0).toLowerCase()) >= 0)</span>&nbsp; <span class='diff-add'> delimiter = delimiter.substr(1);</span>&nbsp; <span class='diff-add'> var singleline = delimiter.length == 1;</span>&nbsp; <span class='diff-add'> var OUTCLASS = "string";</span>&nbsp; <span class='diff-add'> function tokenString(stream, state) {</span>&nbsp; <span class='diff-add'> while (!stream.eol()) {</span>&nbsp; <span class='diff-add'> stream.eatWhile(/[^'"\\]/);</span>&nbsp; <span class='diff-add'> if (stream.eat("\\")) {</span>&nbsp; <span class='diff-add'> stream.next();</span>&nbsp; <span class='diff-add'> if (singleline && stream.eol())</span>&nbsp; <span class='diff-add'> return OUTCLASS;</span>&nbsp; <span class='diff-add'> } else if (stream.match(delimiter)) {</span>&nbsp; <span class='diff-add'> state.tokenize = tokenBase;</span>&nbsp; <span class='diff-add'> return OUTCLASS;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> stream.eat(/['"]/);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (singleline) {</span>&nbsp; <span class='diff-add'> if (parserConf.singleLineStringErrors)</span>&nbsp; <span class='diff-add'> return ERRORCLASS;</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> state.tokenize = tokenBase;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return OUTCLASS;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> tokenString.isString = true;</span>&nbsp; <span class='diff-add'> return tokenString;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function pushScope(stream, state, type) {</span>&nbsp; <span class='diff-add'> var offset = 0, align = null;</span>&nbsp; <span class='diff-add'> if (type == "py") {</span>&nbsp; <span class='diff-add'> while (top(state).type != "py")</span>&nbsp; <span class='diff-add'> state.scopes.pop();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> offset = top(state).offset + (type == "py" ? conf.indentUnit : hangingIndent);</span>&nbsp; <span class='diff-add'> if (type != "py" && !stream.match(/^(\s|#.*)*$/, false))</span>&nbsp; <span class='diff-add'> align = stream.column() + 1;</span>&nbsp; <span class='diff-add'> state.scopes.push({offset: offset, type: type, align: align});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function dedent(stream, state) {</span>&nbsp; <span class='diff-add'> var indented = stream.indentation();</span>&nbsp; <span class='diff-add'> while (top(state).offset > indented) {</span>&nbsp; <span class='diff-add'> if (top(state).type != "py") return true;</span>&nbsp; <span class='diff-add'> state.scopes.pop();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return top(state).offset != indented;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function tokenLexer(stream, state) {</span>&nbsp; <span class='diff-add'> var style = state.tokenize(stream, state);</span>&nbsp; <span class='diff-add'> var current = stream.current();</span>&nbsp; <span class='diff-add'> // Handle '.' connected identifiers</span>&nbsp; <span class='diff-add'> if (current == ".") {</span>&nbsp; <span class='diff-add'> style = stream.match(identifiers, false) ? null : ERRORCLASS;</span>&nbsp; <span class='diff-add'> if (style == null && state.lastStyle == "meta") {</span>&nbsp; <span class='diff-add'> // Apply 'meta' style to '.' connected identifiers when</span>&nbsp; <span class='diff-add'> // appropriate.</span>&nbsp; <span class='diff-add'> style = "meta";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return style;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Handle decorators</span>&nbsp; <span class='diff-add'> if (current == "@"){</span>&nbsp; <span class='diff-add'> if(parserConf.version && parseInt(parserConf.version, 10) == 3){</span>&nbsp; <span class='diff-add'> return stream.match(identifiers, false) ? "meta" : "operator";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return stream.match(identifiers, false) ? "meta" : ERRORCLASS;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if ((style == "variable" || style == "builtin")</span>&nbsp; <span class='diff-add'> && state.lastStyle == "meta")</span>&nbsp; <span class='diff-add'> style = "meta";</span>&nbsp; <span class='diff-add'> // Handle scope changes.</span>&nbsp; <span class='diff-add'> if (current == "pass" || current == "return")</span>&nbsp; <span class='diff-add'> state.dedent += 1;</span>&nbsp; <span class='diff-add'> if (current == "lambda") state.lambda = true;</span>&nbsp; <span class='diff-add'> if (current == ":" && !state.lambda && top(state).type == "py")</span>&nbsp; <span class='diff-add'> pushScope(stream, state, "py");</span>&nbsp; <span class='diff-add'> var delimiter_index = current.length == 1 ? "[({".indexOf(current) : -1;</span>&nbsp; <span class='diff-add'> if (delimiter_index != -1)</span>&nbsp; <span class='diff-add'> pushScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1));</span>&nbsp; <span class='diff-add'> delimiter_index = "])}".indexOf(current);</span>&nbsp; <span class='diff-add'> if (delimiter_index != -1) {</span>&nbsp; <span class='diff-add'> if (top(state).type == current) state.scopes.pop();</span>&nbsp; <span class='diff-add'> else return ERRORCLASS;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (state.dedent > 0 && stream.eol() && top(state).type == "py") {</span>&nbsp; <span class='diff-add'> if (state.scopes.length > 1) state.scopes.pop();</span>&nbsp; <span class='diff-add'> state.dedent -= 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return style;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var external = {</span>&nbsp; <span class='diff-add'> startState: function(basecolumn) {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> tokenize: tokenBase,</span>&nbsp; <span class='diff-add'> scopes: [{offset: basecolumn || 0, type: "py", align: null}],</span>&nbsp; <span class='diff-add'> lastStyle: null,</span>&nbsp; <span class='diff-add'> lastToken: null,</span>&nbsp; <span class='diff-add'> lambda: false,</span>&nbsp; <span class='diff-add'> dedent: 0</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> token: function(stream, state) {</span>&nbsp; <span class='diff-add'> var addErr = state.errorToken;</span>&nbsp; <span class='diff-add'> if (addErr) state.errorToken = false;</span>&nbsp; <span class='diff-add'> var style = tokenLexer(stream, state);</span>&nbsp; <span class='diff-add'> state.lastStyle = style;</span>&nbsp; <span class='diff-add'> var current = stream.current();</span>&nbsp; <span class='diff-add'> if (current && style)</span>&nbsp; <span class='diff-add'> state.lastToken = current;</span>&nbsp; <span class='diff-add'> if (stream.eol() && state.lambda)</span>&nbsp; <span class='diff-add'> state.lambda = false;</span>&nbsp; <span class='diff-add'> return addErr ? style + " " + ERRORCLASS : style;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> indent: function(state, textAfter) {</span>&nbsp; <span class='diff-add'> if (state.tokenize != tokenBase)</span>&nbsp; <span class='diff-add'> return state.tokenize.isString ? CodeMirror.Pass : 0;</span>&nbsp; <span class='diff-add'> var scope = top(state);</span>&nbsp; <span class='diff-add'> var closing = textAfter && textAfter.charAt(0) == scope.type;</span>&nbsp; <span class='diff-add'> if (scope.align != null)</span>&nbsp; <span class='diff-add'> return scope.align - (closing ? 1 : 0);</span>&nbsp; <span class='diff-add'> else if (closing && state.scopes.length > 1)</span>&nbsp; <span class='diff-add'> return state.scopes[state.scopes.length - 2].offset;</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> return scope.offset;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> lineComment: "#",</span>&nbsp; <span class='diff-add'> fold: "indent"</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return external;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> CodeMirror.defineMIME("text/x-python", "python");</span>&nbsp; <span class='diff-add'> var words = function(str) { return str.split(" "); };</span>&nbsp; <span class='diff-add'> CodeMirror.defineMIME("text/x-cython", {</span>&nbsp; <span class='diff-add'> name: "python",</span>&nbsp; <span class='diff-add'> extra_keywords: words("by cdef cimport cpdef ctypedef enum except"+</span>&nbsp; <span class='diff-add'> "extern gil include nogil property public"+</span>&nbsp; <span class='diff-add'> "readonly struct union DEF IF ELIF ELSE")</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/quickhelp.js b/ipynb/Array-feature-overlap-05_files/quickhelp.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..3640213</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/quickhelp.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'base/js/dialog',</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils, dialog) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var platform = utils.platform;</span>&nbsp; <span class='diff-add'> var QuickHelp = function (options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters:</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> * events: $(Events) instance</span>&nbsp; <span class='diff-add'> * keyboard_manager: KeyboardManager instance</span>&nbsp; <span class='diff-add'> * notebook: Notebook instance</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span>&nbsp; <span class='diff-add'> this.notebook = options.notebook;</span>&nbsp; <span class='diff-add'> this.keyboard_manager.quick_help = this;</span>&nbsp; <span class='diff-add'> this.events = options.events;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var cmd_ctrl = 'Ctrl-';</span>&nbsp; <span class='diff-add'> var platform_specific;</span>&nbsp; <span class='diff-add'> if (platform === 'MacOS') {</span>&nbsp; <span class='diff-add'> // Mac OS X specific</span>&nbsp; <span class='diff-add'> cmd_ctrl = 'Cmd-';</span>&nbsp; <span class='diff-add'> platform_specific = [</span>&nbsp; <span class='diff-add'> { shortcut: "Cmd-Up", help:"go to cell start" },</span>&nbsp; <span class='diff-add'> { shortcut: "Cmd-Down", help:"go to cell end" },</span>&nbsp; <span class='diff-add'> { shortcut: "Alt-Left", help:"go one word left" },</span>&nbsp; <span class='diff-add'> { shortcut: "Alt-Right", help:"go one word right" },</span>&nbsp; <span class='diff-add'> { shortcut: "Alt-Backspace", help:"delete word before" },</span>&nbsp; <span class='diff-add'> { shortcut: "Alt-Delete", help:"delete word after" },</span>&nbsp; <span class='diff-add'> ];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // PC specific</span>&nbsp; <span class='diff-add'> platform_specific = [</span>&nbsp; <span class='diff-add'> { shortcut: "Ctrl-Home", help:"go to cell start" },</span>&nbsp; <span class='diff-add'> { shortcut: "Ctrl-Up", help:"go to cell start" },</span>&nbsp; <span class='diff-add'> { shortcut: "Ctrl-End", help:"go to cell end" },</span>&nbsp; <span class='diff-add'> { shortcut: "Ctrl-Down", help:"go to cell end" },</span>&nbsp; <span class='diff-add'> { shortcut: "Ctrl-Left", help:"go one word left" },</span>&nbsp; <span class='diff-add'> { shortcut: "Ctrl-Right", help:"go one word right" },</span>&nbsp; <span class='diff-add'> { shortcut: "Ctrl-Backspace", help:"delete word before" },</span>&nbsp; <span class='diff-add'> { shortcut: "Ctrl-Delete", help:"delete word after" },</span>&nbsp; <span class='diff-add'> ];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var cm_shortcuts = [</span>&nbsp; <span class='diff-add'> { shortcut:"Tab", help:"code completion or indent" },</span>&nbsp; <span class='diff-add'> { shortcut:"Shift-Tab", help:"tooltip" },</span>&nbsp; <span class='diff-add'> { shortcut: cmd_ctrl + "]", help:"indent" },</span>&nbsp; <span class='diff-add'> { shortcut: cmd_ctrl + "[", help:"dedent" },</span>&nbsp; <span class='diff-add'> { shortcut: cmd_ctrl + "a", help:"select all" },</span>&nbsp; <span class='diff-add'> { shortcut: cmd_ctrl + "z", help:"undo" },</span>&nbsp; <span class='diff-add'> { shortcut: cmd_ctrl + "Shift-z", help:"redo" },</span>&nbsp; <span class='diff-add'> { shortcut: cmd_ctrl + "y", help:"redo" },</span>&nbsp; <span class='diff-add'> ].concat( platform_specific );</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var mac_humanize_map = {</span>&nbsp; <span class='diff-add'> // all these are unicode, will probably display badly on anything except macs.</span>&nbsp; <span class='diff-add'> // these are the standard symbol that are used in MacOS native menus</span>&nbsp; <span class='diff-add'> // cf http://apple.stackexchange.com/questions/55727/</span>&nbsp; <span class='diff-add'> // for htmlentities and/or unicode value</span>&nbsp; <span class='diff-add'> 'cmd':'⌘',</span>&nbsp; <span class='diff-add'> 'shift':'⇧',</span>&nbsp; <span class='diff-add'> 'alt':'⌥',</span>&nbsp; <span class='diff-add'> 'up':'↑',</span>&nbsp; <span class='diff-add'> 'down':'↓',</span>&nbsp; <span class='diff-add'> 'left':'←',</span>&nbsp; <span class='diff-add'> 'right':'→',</span>&nbsp; <span class='diff-add'> 'eject':'⏏',</span>&nbsp; <span class='diff-add'> 'tab':'⇥',</span>&nbsp; <span class='diff-add'> 'backtab':'⇤',</span>&nbsp; <span class='diff-add'> 'capslock':'⇪',</span>&nbsp; <span class='diff-add'> 'esc':'esc',</span>&nbsp; <span class='diff-add'> 'ctrl':'⌃',</span>&nbsp; <span class='diff-add'> 'enter':'↩',</span>&nbsp; <span class='diff-add'> 'pageup':'⇞',</span>&nbsp; <span class='diff-add'> 'pagedown':'⇟',</span>&nbsp; <span class='diff-add'> 'home':'↖',</span>&nbsp; <span class='diff-add'> 'end':'↘',</span>&nbsp; <span class='diff-add'> 'altenter':'⌤',</span>&nbsp; <span class='diff-add'> 'space':'␣',</span>&nbsp; <span class='diff-add'> 'delete':'⌦',</span>&nbsp; <span class='diff-add'> 'backspace':'⌫',</span>&nbsp; <span class='diff-add'> 'apple':'',</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var default_humanize_map = {</span>&nbsp; <span class='diff-add'> 'shift':'Shift',</span>&nbsp; <span class='diff-add'> 'alt':'Alt',</span>&nbsp; <span class='diff-add'> 'up':'Up',</span>&nbsp; <span class='diff-add'> 'down':'Down',</span>&nbsp; <span class='diff-add'> 'left':'Left',</span>&nbsp; <span class='diff-add'> 'right':'Right',</span>&nbsp; <span class='diff-add'> 'tab':'Tab',</span>&nbsp; <span class='diff-add'> 'capslock':'Caps Lock',</span>&nbsp; <span class='diff-add'> 'esc':'Esc',</span>&nbsp; <span class='diff-add'> 'ctrl':'Ctrl',</span>&nbsp; <span class='diff-add'> 'enter':'Enter',</span>&nbsp; <span class='diff-add'> 'pageup':'Page Up',</span>&nbsp; <span class='diff-add'> 'pagedown':'Page Down',</span>&nbsp; <span class='diff-add'> 'home':'Home',</span>&nbsp; <span class='diff-add'> 'end':'End',</span>&nbsp; <span class='diff-add'> 'space':'Space',</span>&nbsp; <span class='diff-add'> 'backspace':'Backspace',</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var humanize_map;</span>&nbsp; <span class='diff-add'> if (platform === 'MacOS'){</span>&nbsp; <span class='diff-add'> humanize_map = mac_humanize_map;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> humanize_map = default_humanize_map;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function humanize_key(key){</span>&nbsp; <span class='diff-add'> if (key.length === 1){</span>&nbsp; <span class='diff-add'> key = key.toUpperCase();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return humanize_map[key.toLowerCase()]||key;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function humanize_sequence(sequence){</span>&nbsp; <span class='diff-add'> var joinchar = ',';</span>&nbsp; <span class='diff-add'> var hum = _.map(sequence.replace(/meta/g, 'cmd').split(','), humanize_shortcut).join(joinchar);</span>&nbsp; <span class='diff-add'> return hum;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function humanize_shortcut(shortcut){</span>&nbsp; <span class='diff-add'> var joinchar = '-';</span>&nbsp; <span class='diff-add'> if (platform === 'MacOS'){</span>&nbsp; <span class='diff-add'> joinchar = '';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var sh = _.map(shortcut.split('-'), humanize_key ).join(joinchar);</span>&nbsp; <span class='diff-add'> return sh;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> QuickHelp.prototype.show_keyboard_shortcuts = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * toggles display of keyboard shortcut dialog</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> if ( this.force_rebuild ) {</span>&nbsp; <span class='diff-add'> this.shortcut_dialog.remove();</span>&nbsp; <span class='diff-add'> delete(this.shortcut_dialog);</span>&nbsp; <span class='diff-add'> this.force_rebuild = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if ( this.shortcut_dialog ){</span>&nbsp; <span class='diff-add'> // if dialog is already shown, close it</span>&nbsp; <span class='diff-add'> $(this.shortcut_dialog).modal("toggle");</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var command_shortcuts = this.keyboard_manager.command_shortcuts.help();</span>&nbsp; <span class='diff-add'> var edit_shortcuts = this.keyboard_manager.edit_shortcuts.help();</span>&nbsp; <span class='diff-add'> var help, shortcut;</span>&nbsp; <span class='diff-add'> var i, half, n;</span>&nbsp; <span class='diff-add'> var element = $('<div/>');</span>&nbsp; <span class='diff-add'> // The documentation</span>&nbsp; <span class='diff-add'> var doc = $('<div/>').addClass('alert alert-warning');</span>&nbsp; <span class='diff-add'> doc.append(</span>&nbsp; <span class='diff-add'> $('<button/>').addClass('close').attr('data-dismiss','alert').html('&times;')</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> 'The IPython Notebook has two different keyboard input modes. <b>Edit mode</b> '+</span>&nbsp; <span class='diff-add'> 'allows you to type code/text into a cell and is indicated by a green cell '+</span>&nbsp; <span class='diff-add'> 'border. <b>Command mode</b> binds the keyboard to notebook level actions '+</span>&nbsp; <span class='diff-add'> 'and is indicated by a grey cell border.'</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> if (platform === 'MacOS') {</span>&nbsp; <span class='diff-add'> var key_div = this.build_key_names();</span>&nbsp; <span class='diff-add'> doc.append(key_div);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> element.append(doc);</span>&nbsp; <span class='diff-add'> // Command mode</span>&nbsp; <span class='diff-add'> var cmd_div = this.build_command_help();</span>&nbsp; <span class='diff-add'> element.append(cmd_div);</span>&nbsp; <span class='diff-add'> // Edit mode</span>&nbsp; <span class='diff-add'> var edit_div = this.build_edit_help(cm_shortcuts);</span>&nbsp; <span class='diff-add'> element.append(edit_div);</span>&nbsp; <span class='diff-add'> this.shortcut_dialog = dialog.modal({</span>&nbsp; <span class='diff-add'> title : "Keyboard shortcuts",</span>&nbsp; <span class='diff-add'> body : element,</span>&nbsp; <span class='diff-add'> destroy : false,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> Close : {}</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> notebook: this.notebook,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.shortcut_dialog.addClass("modal_stretch");</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.events.on('rebuild.QuickHelp', function() { that.force_rebuild = true;});</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> QuickHelp.prototype.build_key_names = function () {</span>&nbsp; <span class='diff-add'> var key_names_mac = [{ shortcut:"⌘", help:"Command" },</span>&nbsp; <span class='diff-add'> { shortcut:"⌃", help:"Control" },</span>&nbsp; <span class='diff-add'> { shortcut:"⌥", help:"Option" },</span>&nbsp; <span class='diff-add'> { shortcut:"⇧", help:"Shift" },</span>&nbsp; <span class='diff-add'> { shortcut:"↩", help:"Return" },</span>&nbsp; <span class='diff-add'> { shortcut:"␣", help:"Space" },</span>&nbsp; <span class='diff-add'> { shortcut:"⇥", help:"Tab" }];</span>&nbsp; <span class='diff-add'> var i, half, n;</span>&nbsp; <span class='diff-add'> var div = $('<div/>').append('MacOS modifier keys:');</span>&nbsp; <span class='diff-add'> var sub_div = $('<div/>').addClass('container-fluid');</span>&nbsp; <span class='diff-add'> var col1 = $('<div/>').addClass('col-md-6');</span>&nbsp; <span class='diff-add'> var col2 = $('<div/>').addClass('col-md-6');</span>&nbsp; <span class='diff-add'> n = key_names_mac.length;</span>&nbsp; <span class='diff-add'> half = ~~(n/2); </span>&nbsp; <span class='diff-add'> for (i=0; i<half; i++) { col1.append( </span>&nbsp; <span class='diff-add'> build_one(key_names_mac[i]) </span>&nbsp; <span class='diff-add'> ); }</span>&nbsp; <span class='diff-add'> for (i=half; i<n; i++) { col2.append( </span>&nbsp; <span class='diff-add'> build_one(key_names_mac[i]) </span>&nbsp; <span class='diff-add'> ); }</span>&nbsp; <span class='diff-add'> sub_div.append(col1).append(col2);</span>&nbsp; <span class='diff-add'> div.append(sub_div);</span>&nbsp; <span class='diff-add'> return div;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> QuickHelp.prototype.build_command_help = function () {</span>&nbsp; <span class='diff-add'> var command_shortcuts = this.keyboard_manager.command_shortcuts.help();</span>&nbsp; <span class='diff-add'> return build_div('<h4>Command Mode (press <code>Esc</code> to enable)</h4>', command_shortcuts);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var special_case = { pageup: "PageUp", pagedown: "Page Down", 'minus': '-' };</span>&nbsp; <span class='diff-add'> var prettify = function (s) {</span>&nbsp; <span class='diff-add'> s = s.replace(/-$/, 'minus'); // catch shortcuts using '-' key</span>&nbsp; <span class='diff-add'> var keys = s.split('-');</span>&nbsp; <span class='diff-add'> var k, i;</span>&nbsp; <span class='diff-add'> for (i=0; i < keys.length; i++) {</span>&nbsp; <span class='diff-add'> k = keys[i];</span>&nbsp; <span class='diff-add'> if ( k.length == 1 ) {</span>&nbsp; <span class='diff-add'> keys[i] = "<code><strong>" + k + "</strong></code>";</span>&nbsp; <span class='diff-add'> continue; // leave individual keys lower-cased</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (k.indexOf(',') === -1){</span>&nbsp; <span class='diff-add'> keys[i] = ( special_case[k] ? special_case[k] : k.charAt(0).toUpperCase() + k.slice(1) );</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> keys[i] = "<code><strong>" + keys[i] + "</strong></code>";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return keys.join('-');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> QuickHelp.prototype.build_edit_help = function (cm_shortcuts) {</span>&nbsp; <span class='diff-add'> var edit_shortcuts = this.keyboard_manager.edit_shortcuts.help();</span>&nbsp; <span class='diff-add'> jQuery.merge(cm_shortcuts, edit_shortcuts);</span>&nbsp; <span class='diff-add'> return build_div('<h4>Edit Mode (press <code>Enter</code> to enable)</h4>', cm_shortcuts);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var build_one = function (s) {</span>&nbsp; <span class='diff-add'> var help = s.help;</span>&nbsp; <span class='diff-add'> var shortcut = '';</span>&nbsp; <span class='diff-add'> if(s.shortcut){</span>&nbsp; <span class='diff-add'> shortcut = prettify(humanize_sequence(s.shortcut));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return $('<div>').addClass('quickhelp').</span>&nbsp; <span class='diff-add'> append($('<span/>').addClass('shortcut_key').append($(shortcut))).</span>&nbsp; <span class='diff-add'> append($('<span/>').addClass('shortcut_descr').text(' : ' + help));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var build_div = function (title, shortcuts) {</span>&nbsp; <span class='diff-add'> var i, half, n;</span>&nbsp; <span class='diff-add'> var div = $('<div/>').append($(title));</span>&nbsp; <span class='diff-add'> var sub_div = $('<div/>').addClass('container-fluid');</span>&nbsp; <span class='diff-add'> var col1 = $('<div/>').addClass('col-md-6');</span>&nbsp; <span class='diff-add'> var col2 = $('<div/>').addClass('col-md-6');</span>&nbsp; <span class='diff-add'> n = shortcuts.length;</span>&nbsp; <span class='diff-add'> half = ~~(n/2); // Truncate :)</span>&nbsp; <span class='diff-add'> for (i=0; i<half; i++) { col1.append( build_one(shortcuts[i]) ); }</span>&nbsp; <span class='diff-add'> for (i=half; i<n; i++) { col2.append( build_one(shortcuts[i]) ); }</span>&nbsp; <span class='diff-add'> sub_div.append(col1).append(col2);</span>&nbsp; <span class='diff-add'> div.append(sub_div);</span>&nbsp; <span class='diff-add'> return div;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.QuickHelp = QuickHelp;</span>&nbsp; <span class='diff-add'> return {'QuickHelp': QuickHelp};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/rawcell.js b/ipynb/Array-feature-overlap-05_files/rawcell.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..7a33ed2</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/rawcell.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'notebook/js/celltoolbar',</span>&nbsp; <span class='diff-add'> 'base/js/dialog',</span>&nbsp; <span class='diff-add'> 'base/js/keyboard',</span>&nbsp; <span class='diff-add'>], function($, celltoolbar, dialog, keyboard) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var CellToolbar = celltoolbar.CellToolbar;</span>&nbsp; <span class='diff-add'> var raw_cell_preset = [];</span>&nbsp; <span class='diff-add'> var select_type = CellToolbar.utils.select_ui_generator([</span>&nbsp; <span class='diff-add'> ["None", "-"],</span>&nbsp; <span class='diff-add'> ["LaTeX", "text/latex"],</span>&nbsp; <span class='diff-add'> ["reST", "text/restructuredtext"],</span>&nbsp; <span class='diff-add'> ["HTML", "text/html"],</span>&nbsp; <span class='diff-add'> ["Markdown", "text/markdown"],</span>&nbsp; <span class='diff-add'> ["Python", "text/x-python"],</span>&nbsp; <span class='diff-add'> ["Custom", "dialog"],</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> // setter</span>&nbsp; <span class='diff-add'> function(cell, value) {</span>&nbsp; <span class='diff-add'> if (value === "-") {</span>&nbsp; <span class='diff-add'> delete cell.metadata.raw_mimetype;</span>&nbsp; <span class='diff-add'> } else if (value === 'dialog'){</span>&nbsp; <span class='diff-add'> var dialog = $('<div/>').append(</span>&nbsp; <span class='diff-add'> $("<p/>")</span>&nbsp; <span class='diff-add'> .text("Set the MIME type of the raw cell:")</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<br/>")</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $('<input/>').attr('type','text').attr('size','25')</span>&nbsp; <span class='diff-add'> .val(cell.metadata.raw_mimetype || "-")</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> dialog.modal({</span>&nbsp; <span class='diff-add'> title: "Raw Cell MIME Type",</span>&nbsp; <span class='diff-add'> body: dialog,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> "Cancel": {},</span>&nbsp; <span class='diff-add'> "OK": {</span>&nbsp; <span class='diff-add'> class: "btn-primary",</span>&nbsp; <span class='diff-add'> click: function () {</span>&nbsp; <span class='diff-add'> console.log(cell);</span>&nbsp; <span class='diff-add'> cell.metadata.raw_mimetype = $(this).find('input').val();</span>&nbsp; <span class='diff-add'> console.log(cell.metadata);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> open : function (event, ui) {</span>&nbsp; <span class='diff-add'> var that = $(this);</span>&nbsp; <span class='diff-add'> // Upon ENTER, click the OK button.</span>&nbsp; <span class='diff-add'> that.find('input[type="text"]').keydown(function (event, ui) {</span>&nbsp; <span class='diff-add'> if (event.which === keyboard.keycodes.enter) {</span>&nbsp; <span class='diff-add'> that.find('.btn-primary').first().click();</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> that.find('input[type="text"]').focus().select();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> cell.metadata.raw_mimetype = value;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> //getter</span>&nbsp; <span class='diff-add'> function(cell) {</span>&nbsp; <span class='diff-add'> return cell.metadata.raw_mimetype || "";</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> // name</span>&nbsp; <span class='diff-add'> "Raw NBConvert Format"</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> var register = function (notebook) {</span>&nbsp; <span class='diff-add'> CellToolbar.register_callback('raw_cell.select', select_type, ['raw']);</span>&nbsp; <span class='diff-add'> raw_cell_preset.push('raw_cell.select');</span>&nbsp; <span class='diff-add'> CellToolbar.register_preset('Raw Cell Format', raw_cell_preset, notebook);</span>&nbsp; <span class='diff-add'> console.log('Raw Cell Format toolbar preset loaded.');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return {'register': register};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/require.js b/ipynb/Array-feature-overlap-05_files/require.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..77a5bb1</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/require.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>/** vim: et:ts=4:sw=4:sts=4</span>&nbsp; <span class='diff-add'> * @license RequireJS 2.1.15 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.</span>&nbsp; <span class='diff-add'> * Available via the MIT or new BSD license.</span>&nbsp; <span class='diff-add'> * see: http://github.com/jrburke/requirejs for details</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>//Not using strict: uneven strict support in browsers, #392, and causes</span>&nbsp; <span class='diff-add'>//problems with requirejs.exec()/transpiler plugins that may not be strict.</span>&nbsp; <span class='diff-add'>/*jslint regexp: true, nomen: true, sloppy: true */</span>&nbsp; <span class='diff-add'>/*global window, navigator, document, importScripts, setTimeout, opera */</span>&nbsp; <span class='diff-add'>var requirejs, require, define;</span>&nbsp; <span class='diff-add'>(function (global) {</span>&nbsp; <span class='diff-add'> var req, s, head, baseElement, dataMain, src,</span>&nbsp; <span class='diff-add'> interactiveScript, currentlyAddingScript, mainScript, subPath,</span>&nbsp; <span class='diff-add'> version = '2.1.15',</span>&nbsp; <span class='diff-add'> commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,</span>&nbsp; <span class='diff-add'> cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,</span>&nbsp; <span class='diff-add'> jsSuffixRegExp = /\.js$/,</span>&nbsp; <span class='diff-add'> currDirRegExp = /^\.\//,</span>&nbsp; <span class='diff-add'> op = Object.prototype,</span>&nbsp; <span class='diff-add'> ostring = op.toString,</span>&nbsp; <span class='diff-add'> hasOwn = op.hasOwnProperty,</span>&nbsp; <span class='diff-add'> ap = Array.prototype,</span>&nbsp; <span class='diff-add'> apsp = ap.splice,</span>&nbsp; <span class='diff-add'> isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document),</span>&nbsp; <span class='diff-add'> isWebWorker = !isBrowser && typeof importScripts !== 'undefined',</span>&nbsp; <span class='diff-add'> //PS3 indicates loaded and complete, but need to wait for complete</span>&nbsp; <span class='diff-add'> //specifically. Sequence is 'loading', 'loaded', execution,</span>&nbsp; <span class='diff-add'> // then 'complete'. The UA check is unfortunate, but not sure how</span>&nbsp; <span class='diff-add'> //to feature test w/o causing perf issues.</span>&nbsp; <span class='diff-add'> readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?</span>&nbsp; <span class='diff-add'> /^complete$/ : /^(complete|loaded)$/,</span>&nbsp; <span class='diff-add'> defContextName = '_',</span>&nbsp; <span class='diff-add'> //Oh the tragedy, detecting opera. See the usage of isOpera for reason.</span>&nbsp; <span class='diff-add'> isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]',</span>&nbsp; <span class='diff-add'> contexts = {},</span>&nbsp; <span class='diff-add'> cfg = {},</span>&nbsp; <span class='diff-add'> globalDefQueue = [],</span>&nbsp; <span class='diff-add'> useInteractive = false;</span>&nbsp; <span class='diff-add'> function isFunction(it) {</span>&nbsp; <span class='diff-add'> return ostring.call(it) === '[object Function]';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function isArray(it) {</span>&nbsp; <span class='diff-add'> return ostring.call(it) === '[object Array]';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Helper function for iterating over an array. If the func returns</span>&nbsp; <span class='diff-add'> * a true value, it will break out of the loop.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function each(ary, func) {</span>&nbsp; <span class='diff-add'> if (ary) {</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> for (i = 0; i < ary.length; i += 1) {</span>&nbsp; <span class='diff-add'> if (ary[i] && func(ary[i], i, ary)) {</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Helper function for iterating over an array backwards. If the func</span>&nbsp; <span class='diff-add'> * returns a true value, it will break out of the loop.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function eachReverse(ary, func) {</span>&nbsp; <span class='diff-add'> if (ary) {</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> for (i = ary.length - 1; i > -1; i -= 1) {</span>&nbsp; <span class='diff-add'> if (ary[i] && func(ary[i], i, ary)) {</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function hasProp(obj, prop) {</span>&nbsp; <span class='diff-add'> return hasOwn.call(obj, prop);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function getOwn(obj, prop) {</span>&nbsp; <span class='diff-add'> return hasProp(obj, prop) && obj[prop];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Cycles over properties in an object and calls a function for each</span>&nbsp; <span class='diff-add'> * property value. If the function returns a truthy value, then the</span>&nbsp; <span class='diff-add'> * iteration is stopped.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function eachProp(obj, func) {</span>&nbsp; <span class='diff-add'> var prop;</span>&nbsp; <span class='diff-add'> for (prop in obj) {</span>&nbsp; <span class='diff-add'> if (hasProp(obj, prop)) {</span>&nbsp; <span class='diff-add'> if (func(obj[prop], prop)) {</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Simple function to mix in properties from source into target,</span>&nbsp; <span class='diff-add'> * but only if target does not already have a property of the same name.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function mixin(target, source, force, deepStringMixin) {</span>&nbsp; <span class='diff-add'> if (source) {</span>&nbsp; <span class='diff-add'> eachProp(source, function (value, prop) {</span>&nbsp; <span class='diff-add'> if (force || !hasProp(target, prop)) {</span>&nbsp; <span class='diff-add'> if (deepStringMixin && typeof value === 'object' && value &&</span>&nbsp; <span class='diff-add'> !isArray(value) && !isFunction(value) &&</span>&nbsp; <span class='diff-add'> !(value instanceof RegExp)) {</span>&nbsp; <span class='diff-add'> if (!target[prop]) {</span>&nbsp; <span class='diff-add'> target[prop] = {};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> mixin(target[prop], value, force, deepStringMixin);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> target[prop] = value;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return target;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Similar to Function.prototype.bind, but the 'this' object is specified</span>&nbsp; <span class='diff-add'> //first, since it is easier to read/figure out what 'this' will be.</span>&nbsp; <span class='diff-add'> function bind(obj, fn) {</span>&nbsp; <span class='diff-add'> return function () {</span>&nbsp; <span class='diff-add'> return fn.apply(obj, arguments);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function scripts() {</span>&nbsp; <span class='diff-add'> return document.getElementsByTagName('script');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function defaultOnError(err) {</span>&nbsp; <span class='diff-add'> throw err;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Allow getting a global that is expressed in</span>&nbsp; <span class='diff-add'> //dot notation, like 'a.b.c'.</span>&nbsp; <span class='diff-add'> function getGlobal(value) {</span>&nbsp; <span class='diff-add'> if (!value) {</span>&nbsp; <span class='diff-add'> return value;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var g = global;</span>&nbsp; <span class='diff-add'> each(value.split('.'), function (part) {</span>&nbsp; <span class='diff-add'> g = g[part];</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return g;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructs an error with a pointer to an URL with more information.</span>&nbsp; <span class='diff-add'> * @param {String} id the error ID that maps to an ID on a web page.</span>&nbsp; <span class='diff-add'> * @param {String} message human readable error.</span>&nbsp; <span class='diff-add'> * @param {Error} [err] the original error, if there is one.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @returns {Error}</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function makeError(id, msg, err, requireModules) {</span>&nbsp; <span class='diff-add'> var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id);</span>&nbsp; <span class='diff-add'> e.requireType = id;</span>&nbsp; <span class='diff-add'> e.requireModules = requireModules;</span>&nbsp; <span class='diff-add'> if (err) {</span>&nbsp; <span class='diff-add'> e.originalError = err;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return e;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof define !== 'undefined') {</span>&nbsp; <span class='diff-add'> //If a define is already in play via another AMD loader,</span>&nbsp; <span class='diff-add'> //do not overwrite.</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof requirejs !== 'undefined') {</span>&nbsp; <span class='diff-add'> if (isFunction(requirejs)) {</span>&nbsp; <span class='diff-add'> //Do not overwrite an existing requirejs instance.</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cfg = requirejs;</span>&nbsp; <span class='diff-add'> requirejs = undefined;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Allow for a require config object</span>&nbsp; <span class='diff-add'> if (typeof require !== 'undefined' && !isFunction(require)) {</span>&nbsp; <span class='diff-add'> //assume it is a config object.</span>&nbsp; <span class='diff-add'> cfg = require;</span>&nbsp; <span class='diff-add'> require = undefined;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function newContext(contextName) {</span>&nbsp; <span class='diff-add'> var inCheckLoaded, Module, context, handlers,</span>&nbsp; <span class='diff-add'> checkLoadedTimeoutId,</span>&nbsp; <span class='diff-add'> config = {</span>&nbsp; <span class='diff-add'> //Defaults. Do not set a default for map</span>&nbsp; <span class='diff-add'> //config to speed up normalize(), which</span>&nbsp; <span class='diff-add'> //will run faster if there is no default.</span>&nbsp; <span class='diff-add'> waitSeconds: 7,</span>&nbsp; <span class='diff-add'> baseUrl: './',</span>&nbsp; <span class='diff-add'> paths: {},</span>&nbsp; <span class='diff-add'> bundles: {},</span>&nbsp; <span class='diff-add'> pkgs: {},</span>&nbsp; <span class='diff-add'> shim: {},</span>&nbsp; <span class='diff-add'> config: {}</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> registry = {},</span>&nbsp; <span class='diff-add'> //registry of just enabled modules, to speed</span>&nbsp; <span class='diff-add'> //cycle breaking code when lots of modules</span>&nbsp; <span class='diff-add'> //are registered, but not activated.</span>&nbsp; <span class='diff-add'> enabledRegistry = {},</span>&nbsp; <span class='diff-add'> undefEvents = {},</span>&nbsp; <span class='diff-add'> defQueue = [],</span>&nbsp; <span class='diff-add'> defined = {},</span>&nbsp; <span class='diff-add'> urlFetched = {},</span>&nbsp; <span class='diff-add'> bundlesMap = {},</span>&nbsp; <span class='diff-add'> requireCounter = 1,</span>&nbsp; <span class='diff-add'> unnormalizedCounter = 1;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Trims the . and .. from an array of path segments.</span>&nbsp; <span class='diff-add'> * It will keep a leading path segment if a .. will become</span>&nbsp; <span class='diff-add'> * the first path segment, to help with module name lookups,</span>&nbsp; <span class='diff-add'> * which act like paths, but can be remapped. But the end result,</span>&nbsp; <span class='diff-add'> * all paths that use this function should look normalized.</span>&nbsp; <span class='diff-add'> * NOTE: this method MODIFIES the input array.</span>&nbsp; <span class='diff-add'> * @param {Array} ary the array of path segments.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function trimDots(ary) {</span>&nbsp; <span class='diff-add'> var i, part;</span>&nbsp; <span class='diff-add'> for (i = 0; i < ary.length; i++) {</span>&nbsp; <span class='diff-add'> part = ary[i];</span>&nbsp; <span class='diff-add'> if (part === '.') {</span>&nbsp; <span class='diff-add'> ary.splice(i, 1);</span>&nbsp; <span class='diff-add'> i -= 1;</span>&nbsp; <span class='diff-add'> } else if (part === '..') {</span>&nbsp; <span class='diff-add'> // If at the start, or previous value is still ..,</span>&nbsp; <span class='diff-add'> // keep them so that when converted to a path it may</span>&nbsp; <span class='diff-add'> // still work when converted to a path, even though</span>&nbsp; <span class='diff-add'> // as an ID it is less than ideal. In larger point</span>&nbsp; <span class='diff-add'> // releases, may be better to just kick out an error.</span>&nbsp; <span class='diff-add'> if (i === 0 || (i == 1 && ary[2] === '..') || ary[i - 1] === '..') {</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> } else if (i > 0) {</span>&nbsp; <span class='diff-add'> ary.splice(i - 1, 2);</span>&nbsp; <span class='diff-add'> i -= 2;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Given a relative module name, like ./something, normalize it to</span>&nbsp; <span class='diff-add'> * a real name that can be mapped to a path.</span>&nbsp; <span class='diff-add'> * @param {String} name the relative name</span>&nbsp; <span class='diff-add'> * @param {String} baseName a real name that the name arg is relative</span>&nbsp; <span class='diff-add'> * to.</span>&nbsp; <span class='diff-add'> * @param {Boolean} applyMap apply the map config to the value. Should</span>&nbsp; <span class='diff-add'> * only be done if this normalization is for a dependency ID.</span>&nbsp; <span class='diff-add'> * @returns {String} normalized name</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function normalize(name, baseName, applyMap) {</span>&nbsp; <span class='diff-add'> var pkgMain, mapValue, nameParts, i, j, nameSegment, lastIndex,</span>&nbsp; <span class='diff-add'> foundMap, foundI, foundStarMap, starI, normalizedBaseParts,</span>&nbsp; <span class='diff-add'> baseParts = (baseName && baseName.split('/')),</span>&nbsp; <span class='diff-add'> map = config.map,</span>&nbsp; <span class='diff-add'> starMap = map && map['*'];</span>&nbsp; <span class='diff-add'> //Adjust any relative paths.</span>&nbsp; <span class='diff-add'> if (name) {</span>&nbsp; <span class='diff-add'> name = name.split('/');</span>&nbsp; <span class='diff-add'> lastIndex = name.length - 1;</span>&nbsp; <span class='diff-add'> // If wanting node ID compatibility, strip .js from end</span>&nbsp; <span class='diff-add'> // of IDs. Have to do this here, and not in nameToUrl</span>&nbsp; <span class='diff-add'> // because node allows either .js or non .js to map</span>&nbsp; <span class='diff-add'> // to same file.</span>&nbsp; <span class='diff-add'> if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {</span>&nbsp; <span class='diff-add'> name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Starts with a '.' so need the baseName</span>&nbsp; <span class='diff-add'> if (name[0].charAt(0) === '.' && baseParts) {</span>&nbsp; <span class='diff-add'> //Convert baseName to array, and lop off the last part,</span>&nbsp; <span class='diff-add'> //so that . matches that 'directory' and not name of the baseName's</span>&nbsp; <span class='diff-add'> //module. For instance, baseName of 'one/two/three', maps to</span>&nbsp; <span class='diff-add'> //'one/two/three.js', but we want the directory, 'one/two' for</span>&nbsp; <span class='diff-add'> //this normalization.</span>&nbsp; <span class='diff-add'> normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);</span>&nbsp; <span class='diff-add'> name = normalizedBaseParts.concat(name);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> trimDots(name);</span>&nbsp; <span class='diff-add'> name = name.join('/');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Apply map config if available.</span>&nbsp; <span class='diff-add'> if (applyMap && map && (baseParts || starMap)) {</span>&nbsp; <span class='diff-add'> nameParts = name.split('/');</span>&nbsp; <span class='diff-add'> outerLoop: for (i = nameParts.length; i > 0; i -= 1) {</span>&nbsp; <span class='diff-add'> nameSegment = nameParts.slice(0, i).join('/');</span>&nbsp; <span class='diff-add'> if (baseParts) {</span>&nbsp; <span class='diff-add'> //Find the longest baseName segment match in the config.</span>&nbsp; <span class='diff-add'> //So, do joins on the biggest to smallest lengths of baseParts.</span>&nbsp; <span class='diff-add'> for (j = baseParts.length; j > 0; j -= 1) {</span>&nbsp; <span class='diff-add'> mapValue = getOwn(map, baseParts.slice(0, j).join('/'));</span>&nbsp; <span class='diff-add'> //baseName segment has config, find if it has one for</span>&nbsp; <span class='diff-add'> //this name.</span>&nbsp; <span class='diff-add'> if (mapValue) {</span>&nbsp; <span class='diff-add'> mapValue = getOwn(mapValue, nameSegment);</span>&nbsp; <span class='diff-add'> if (mapValue) {</span>&nbsp; <span class='diff-add'> //Match, update name to the new value.</span>&nbsp; <span class='diff-add'> foundMap = mapValue;</span>&nbsp; <span class='diff-add'> foundI = i;</span>&nbsp; <span class='diff-add'> break outerLoop;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Check for a star map match, but just hold on to it,</span>&nbsp; <span class='diff-add'> //if there is a shorter segment match later in a matching</span>&nbsp; <span class='diff-add'> //config, then favor over this star map.</span>&nbsp; <span class='diff-add'> if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) {</span>&nbsp; <span class='diff-add'> foundStarMap = getOwn(starMap, nameSegment);</span>&nbsp; <span class='diff-add'> starI = i;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!foundMap && foundStarMap) {</span>&nbsp; <span class='diff-add'> foundMap = foundStarMap;</span>&nbsp; <span class='diff-add'> foundI = starI;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (foundMap) {</span>&nbsp; <span class='diff-add'> nameParts.splice(0, foundI, foundMap);</span>&nbsp; <span class='diff-add'> name = nameParts.join('/');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // If the name points to a package's name, use</span>&nbsp; <span class='diff-add'> // the package main instead.</span>&nbsp; <span class='diff-add'> pkgMain = getOwn(config.pkgs, name);</span>&nbsp; <span class='diff-add'> return pkgMain ? pkgMain : name;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function removeScript(name) {</span>&nbsp; <span class='diff-add'> if (isBrowser) {</span>&nbsp; <span class='diff-add'> each(scripts(), function (scriptNode) {</span>&nbsp; <span class='diff-add'> if (scriptNode.getAttribute('data-requiremodule') === name &&</span>&nbsp; <span class='diff-add'> scriptNode.getAttribute('data-requirecontext') === context.contextName) {</span>&nbsp; <span class='diff-add'> scriptNode.parentNode.removeChild(scriptNode);</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function hasPathFallback(id) {</span>&nbsp; <span class='diff-add'> var pathConfig = getOwn(config.paths, id);</span>&nbsp; <span class='diff-add'> if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) {</span>&nbsp; <span class='diff-add'> //Pop off the first array value, since it failed, and</span>&nbsp; <span class='diff-add'> //retry</span>&nbsp; <span class='diff-add'> pathConfig.shift();</span>&nbsp; <span class='diff-add'> context.require.undef(id);</span>&nbsp; <span class='diff-add'> //Custom require that does not do map translation, since</span>&nbsp; <span class='diff-add'> //ID is "absolute", already mapped/resolved.</span>&nbsp; <span class='diff-add'> context.makeRequire(null, {</span>&nbsp; <span class='diff-add'> skipMap: true</span>&nbsp; <span class='diff-add'> })([id]);</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Turns a plugin!resource to [plugin, resource]</span>&nbsp; <span class='diff-add'> //with the plugin being undefined if the name</span>&nbsp; <span class='diff-add'> //did not have a plugin prefix.</span>&nbsp; <span class='diff-add'> function splitPrefix(name) {</span>&nbsp; <span class='diff-add'> var prefix,</span>&nbsp; <span class='diff-add'> index = name ? name.indexOf('!') : -1;</span>&nbsp; <span class='diff-add'> if (index > -1) {</span>&nbsp; <span class='diff-add'> prefix = name.substring(0, index);</span>&nbsp; <span class='diff-add'> name = name.substring(index + 1, name.length);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return [prefix, name];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Creates a module mapping that includes plugin prefix, module</span>&nbsp; <span class='diff-add'> * name, and path. If parentModuleMap is provided it will</span>&nbsp; <span class='diff-add'> * also normalize the name via require.normalize()</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param {String} name the module name</span>&nbsp; <span class='diff-add'> * @param {String} [parentModuleMap] parent module map</span>&nbsp; <span class='diff-add'> * for the module name, used to resolve relative names.</span>&nbsp; <span class='diff-add'> * @param {Boolean} isNormalized: is the ID already normalized.</span>&nbsp; <span class='diff-add'> * This is true if this call is done for a define() module ID.</span>&nbsp; <span class='diff-add'> * @param {Boolean} applyMap: apply the map config to the ID.</span>&nbsp; <span class='diff-add'> * Should only be true if this map is for a dependency.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @returns {Object}</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {</span>&nbsp; <span class='diff-add'> var url, pluginModule, suffix, nameParts,</span>&nbsp; <span class='diff-add'> prefix = null,</span>&nbsp; <span class='diff-add'> parentName = parentModuleMap ? parentModuleMap.name : null,</span>&nbsp; <span class='diff-add'> originalName = name,</span>&nbsp; <span class='diff-add'> isDefine = true,</span>&nbsp; <span class='diff-add'> normalizedName = '';</span>&nbsp; <span class='diff-add'> //If no name, then it means it is a require call, generate an</span>&nbsp; <span class='diff-add'> //internal name.</span>&nbsp; <span class='diff-add'> if (!name) {</span>&nbsp; <span class='diff-add'> isDefine = false;</span>&nbsp; <span class='diff-add'> name = '_@r' + (requireCounter += 1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> nameParts = splitPrefix(name);</span>&nbsp; <span class='diff-add'> prefix = nameParts[0];</span>&nbsp; <span class='diff-add'> name = nameParts[1];</span>&nbsp; <span class='diff-add'> if (prefix) {</span>&nbsp; <span class='diff-add'> prefix = normalize(prefix, parentName, applyMap);</span>&nbsp; <span class='diff-add'> pluginModule = getOwn(defined, prefix);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Account for relative paths if there is a base name.</span>&nbsp; <span class='diff-add'> if (name) {</span>&nbsp; <span class='diff-add'> if (prefix) {</span>&nbsp; <span class='diff-add'> if (pluginModule && pluginModule.normalize) {</span>&nbsp; <span class='diff-add'> //Plugin is loaded, use its normalize method.</span>&nbsp; <span class='diff-add'> normalizedName = pluginModule.normalize(name, function (name) {</span>&nbsp; <span class='diff-add'> return normalize(name, parentName, applyMap);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // If nested plugin references, then do not try to</span>&nbsp; <span class='diff-add'> // normalize, as it will not normalize correctly. This</span>&nbsp; <span class='diff-add'> // places a restriction on resourceIds, and the longer</span>&nbsp; <span class='diff-add'> // term solution is not to normalize until plugins are</span>&nbsp; <span class='diff-add'> // loaded and all normalizations to allow for async</span>&nbsp; <span class='diff-add'> // loading of a loader plugin. But for now, fixes the</span>&nbsp; <span class='diff-add'> // common uses. Details in #1131</span>&nbsp; <span class='diff-add'> normalizedName = name.indexOf('!') === -1 ?</span>&nbsp; <span class='diff-add'> normalize(name, parentName, applyMap) :</span>&nbsp; <span class='diff-add'> name;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> //A regular module.</span>&nbsp; <span class='diff-add'> normalizedName = normalize(name, parentName, applyMap);</span>&nbsp; <span class='diff-add'> //Normalized name may be a plugin ID due to map config</span>&nbsp; <span class='diff-add'> //application in normalize. The map config values must</span>&nbsp; <span class='diff-add'> //already be normalized, so do not need to redo that part.</span>&nbsp; <span class='diff-add'> nameParts = splitPrefix(normalizedName);</span>&nbsp; <span class='diff-add'> prefix = nameParts[0];</span>&nbsp; <span class='diff-add'> normalizedName = nameParts[1];</span>&nbsp; <span class='diff-add'> isNormalized = true;</span>&nbsp; <span class='diff-add'> url = context.nameToUrl(normalizedName);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //If the id is a plugin id that cannot be determined if it needs</span>&nbsp; <span class='diff-add'> //normalization, stamp it with a unique ID so two matching relative</span>&nbsp; <span class='diff-add'> //ids that may conflict can be separate.</span>&nbsp; <span class='diff-add'> suffix = prefix && !pluginModule && !isNormalized ?</span>&nbsp; <span class='diff-add'> '_unnormalized' + (unnormalizedCounter += 1) :</span>&nbsp; <span class='diff-add'> '';</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> prefix: prefix,</span>&nbsp; <span class='diff-add'> name: normalizedName,</span>&nbsp; <span class='diff-add'> parentMap: parentModuleMap,</span>&nbsp; <span class='diff-add'> unnormalized: !!suffix,</span>&nbsp; <span class='diff-add'> url: url,</span>&nbsp; <span class='diff-add'> originalName: originalName,</span>&nbsp; <span class='diff-add'> isDefine: isDefine,</span>&nbsp; <span class='diff-add'> id: (prefix ?</span>&nbsp; <span class='diff-add'> prefix + '!' + normalizedName :</span>&nbsp; <span class='diff-add'> normalizedName) + suffix</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function getModule(depMap) {</span>&nbsp; <span class='diff-add'> var id = depMap.id,</span>&nbsp; <span class='diff-add'> mod = getOwn(registry, id);</span>&nbsp; <span class='diff-add'> if (!mod) {</span>&nbsp; <span class='diff-add'> mod = registry[id] = new context.Module(depMap);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return mod;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function on(depMap, name, fn) {</span>&nbsp; <span class='diff-add'> var id = depMap.id,</span>&nbsp; <span class='diff-add'> mod = getOwn(registry, id);</span>&nbsp; <span class='diff-add'> if (hasProp(defined, id) &&</span>&nbsp; <span class='diff-add'> (!mod || mod.defineEmitComplete)) {</span>&nbsp; <span class='diff-add'> if (name === 'defined') {</span>&nbsp; <span class='diff-add'> fn(defined[id]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> mod = getModule(depMap);</span>&nbsp; <span class='diff-add'> if (mod.error && name === 'error') {</span>&nbsp; <span class='diff-add'> fn(mod.error);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> mod.on(name, fn);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function onError(err, errback) {</span>&nbsp; <span class='diff-add'> var ids = err.requireModules,</span>&nbsp; <span class='diff-add'> notified = false;</span>&nbsp; <span class='diff-add'> if (errback) {</span>&nbsp; <span class='diff-add'> errback(err);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> each(ids, function (id) {</span>&nbsp; <span class='diff-add'> var mod = getOwn(registry, id);</span>&nbsp; <span class='diff-add'> if (mod) {</span>&nbsp; <span class='diff-add'> //Set error on module, so it skips timeout checks.</span>&nbsp; <span class='diff-add'> mod.error = err;</span>&nbsp; <span class='diff-add'> if (mod.events.error) {</span>&nbsp; <span class='diff-add'> notified = true;</span>&nbsp; <span class='diff-add'> mod.emit('error', err);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (!notified) {</span>&nbsp; <span class='diff-add'> req.onError(err);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Internal method to transfer globalQueue items to this context's</span>&nbsp; <span class='diff-add'> * defQueue.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function takeGlobalQueue() {</span>&nbsp; <span class='diff-add'> //Push all the globalDefQueue items into the context's defQueue</span>&nbsp; <span class='diff-add'> if (globalDefQueue.length) {</span>&nbsp; <span class='diff-add'> //Array splice in the values since the context code has a</span>&nbsp; <span class='diff-add'> //local var ref to defQueue, so cannot just reassign the one</span>&nbsp; <span class='diff-add'> //on context.</span>&nbsp; <span class='diff-add'> apsp.apply(defQueue,</span>&nbsp; <span class='diff-add'> [defQueue.length, 0].concat(globalDefQueue));</span>&nbsp; <span class='diff-add'> globalDefQueue = [];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> handlers = {</span>&nbsp; <span class='diff-add'> 'require': function (mod) {</span>&nbsp; <span class='diff-add'> if (mod.require) {</span>&nbsp; <span class='diff-add'> return mod.require;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return (mod.require = context.makeRequire(mod.map));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> 'exports': function (mod) {</span>&nbsp; <span class='diff-add'> mod.usingExports = true;</span>&nbsp; <span class='diff-add'> if (mod.map.isDefine) {</span>&nbsp; <span class='diff-add'> if (mod.exports) {</span>&nbsp; <span class='diff-add'> return (defined[mod.map.id] = mod.exports);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return (mod.exports = defined[mod.map.id] = {});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> 'module': function (mod) {</span>&nbsp; <span class='diff-add'> if (mod.module) {</span>&nbsp; <span class='diff-add'> return mod.module;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return (mod.module = {</span>&nbsp; <span class='diff-add'> id: mod.map.id,</span>&nbsp; <span class='diff-add'> uri: mod.map.url,</span>&nbsp; <span class='diff-add'> config: function () {</span>&nbsp; <span class='diff-add'> return getOwn(config.config, mod.map.id) || {};</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> exports: mod.exports || (mod.exports = {})</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function cleanRegistry(id) {</span>&nbsp; <span class='diff-add'> //Clean up machinery used for waiting modules.</span>&nbsp; <span class='diff-add'> delete registry[id];</span>&nbsp; <span class='diff-add'> delete enabledRegistry[id];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function breakCycle(mod, traced, processed) {</span>&nbsp; <span class='diff-add'> var id = mod.map.id;</span>&nbsp; <span class='diff-add'> if (mod.error) {</span>&nbsp; <span class='diff-add'> mod.emit('error', mod.error);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> traced[id] = true;</span>&nbsp; <span class='diff-add'> each(mod.depMaps, function (depMap, i) {</span>&nbsp; <span class='diff-add'> var depId = depMap.id,</span>&nbsp; <span class='diff-add'> dep = getOwn(registry, depId);</span>&nbsp; <span class='diff-add'> //Only force things that have not completed</span>&nbsp; <span class='diff-add'> //being defined, so still in the registry,</span>&nbsp; <span class='diff-add'> //and only if it has not been matched up</span>&nbsp; <span class='diff-add'> //in the module already.</span>&nbsp; <span class='diff-add'> if (dep && !mod.depMatched[i] && !processed[depId]) {</span>&nbsp; <span class='diff-add'> if (getOwn(traced, depId)) {</span>&nbsp; <span class='diff-add'> mod.defineDep(i, defined[depId]);</span>&nbsp; <span class='diff-add'> mod.check(); //pass false?</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> breakCycle(dep, traced, processed);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> processed[id] = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function checkLoaded() {</span>&nbsp; <span class='diff-add'> var err, usingPathFallback,</span>&nbsp; <span class='diff-add'> waitInterval = config.waitSeconds * 1000,</span>&nbsp; <span class='diff-add'> //It is possible to disable the wait interval by using waitSeconds of 0.</span>&nbsp; <span class='diff-add'> expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),</span>&nbsp; <span class='diff-add'> noLoads = [],</span>&nbsp; <span class='diff-add'> reqCalls = [],</span>&nbsp; <span class='diff-add'> stillLoading = false,</span>&nbsp; <span class='diff-add'> needCycleCheck = true;</span>&nbsp; <span class='diff-add'> //Do not bother if this call was a result of a cycle break.</span>&nbsp; <span class='diff-add'> if (inCheckLoaded) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> inCheckLoaded = true;</span>&nbsp; <span class='diff-add'> //Figure out the state of all the modules.</span>&nbsp; <span class='diff-add'> eachProp(enabledRegistry, function (mod) {</span>&nbsp; <span class='diff-add'> var map = mod.map,</span>&nbsp; <span class='diff-add'> modId = map.id;</span>&nbsp; <span class='diff-add'> //Skip things that are not enabled or in error state.</span>&nbsp; <span class='diff-add'> if (!mod.enabled) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!map.isDefine) {</span>&nbsp; <span class='diff-add'> reqCalls.push(mod);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (!mod.error) {</span>&nbsp; <span class='diff-add'> //If the module should be executed, and it has not</span>&nbsp; <span class='diff-add'> //been inited and time is up, remember it.</span>&nbsp; <span class='diff-add'> if (!mod.inited && expired) {</span>&nbsp; <span class='diff-add'> if (hasPathFallback(modId)) {</span>&nbsp; <span class='diff-add'> usingPathFallback = true;</span>&nbsp; <span class='diff-add'> stillLoading = true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> noLoads.push(modId);</span>&nbsp; <span class='diff-add'> removeScript(modId);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (!mod.inited && mod.fetched && map.isDefine) {</span>&nbsp; <span class='diff-add'> stillLoading = true;</span>&nbsp; <span class='diff-add'> if (!map.prefix) {</span>&nbsp; <span class='diff-add'> //No reason to keep looking for unfinished</span>&nbsp; <span class='diff-add'> //loading. If the only stillLoading is a</span>&nbsp; <span class='diff-add'> //plugin resource though, keep going,</span>&nbsp; <span class='diff-add'> //because it may be that a plugin resource</span>&nbsp; <span class='diff-add'> //is waiting on a non-plugin cycle.</span>&nbsp; <span class='diff-add'> return (needCycleCheck = false);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (expired && noLoads.length) {</span>&nbsp; <span class='diff-add'> //If wait time expired, throw error of unloaded modules.</span>&nbsp; <span class='diff-add'> err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads);</span>&nbsp; <span class='diff-add'> err.contextName = context.contextName;</span>&nbsp; <span class='diff-add'> return onError(err);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Not expired, check for a cycle.</span>&nbsp; <span class='diff-add'> if (needCycleCheck) {</span>&nbsp; <span class='diff-add'> each(reqCalls, function (mod) {</span>&nbsp; <span class='diff-add'> breakCycle(mod, {}, {});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //If still waiting on loads, and the waiting load is something</span>&nbsp; <span class='diff-add'> //other than a plugin resource, or there are still outstanding</span>&nbsp; <span class='diff-add'> //scripts, then just try back later.</span>&nbsp; <span class='diff-add'> if ((!expired || usingPathFallback) && stillLoading) {</span>&nbsp; <span class='diff-add'> //Something is still waiting to load. Wait for it, but only</span>&nbsp; <span class='diff-add'> //if a timeout is not already in effect.</span>&nbsp; <span class='diff-add'> if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {</span>&nbsp; <span class='diff-add'> checkLoadedTimeoutId = setTimeout(function () {</span>&nbsp; <span class='diff-add'> checkLoadedTimeoutId = 0;</span>&nbsp; <span class='diff-add'> checkLoaded();</span>&nbsp; <span class='diff-add'> }, 50);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> inCheckLoaded = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> Module = function (map) {</span>&nbsp; <span class='diff-add'> this.events = getOwn(undefEvents, map.id) || {};</span>&nbsp; <span class='diff-add'> this.map = map;</span>&nbsp; <span class='diff-add'> this.shim = getOwn(config.shim, map.id);</span>&nbsp; <span class='diff-add'> this.depExports = [];</span>&nbsp; <span class='diff-add'> this.depMaps = [];</span>&nbsp; <span class='diff-add'> this.depMatched = [];</span>&nbsp; <span class='diff-add'> this.pluginMaps = {};</span>&nbsp; <span class='diff-add'> this.depCount = 0;</span>&nbsp; <span class='diff-add'> /* this.exports this.factory</span>&nbsp; <span class='diff-add'> this.depMaps = [],</span>&nbsp; <span class='diff-add'> this.enabled, this.fetched</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Module.prototype = {</span>&nbsp; <span class='diff-add'> init: function (depMaps, factory, errback, options) {</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> //Do not do more inits if already done. Can happen if there</span>&nbsp; <span class='diff-add'> //are multiple define calls for the same module. That is not</span>&nbsp; <span class='diff-add'> //a normal, common case, but it is also not unexpected.</span>&nbsp; <span class='diff-add'> if (this.inited) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.factory = factory;</span>&nbsp; <span class='diff-add'> if (errback) {</span>&nbsp; <span class='diff-add'> //Register for errors on this module.</span>&nbsp; <span class='diff-add'> this.on('error', errback);</span>&nbsp; <span class='diff-add'> } else if (this.events.error) {</span>&nbsp; <span class='diff-add'> //If no errback already, but there are error listeners</span>&nbsp; <span class='diff-add'> //on this module, set up an errback to pass to the deps.</span>&nbsp; <span class='diff-add'> errback = bind(this, function (err) {</span>&nbsp; <span class='diff-add'> this.emit('error', err);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Do a copy of the dependency array, so that</span>&nbsp; <span class='diff-add'> //source inputs are not modified. For example</span>&nbsp; <span class='diff-add'> //"shim" deps are passed in here directly, and</span>&nbsp; <span class='diff-add'> //doing a direct modification of the depMaps array</span>&nbsp; <span class='diff-add'> //would affect that config.</span>&nbsp; <span class='diff-add'> this.depMaps = depMaps && depMaps.slice(0);</span>&nbsp; <span class='diff-add'> this.errback = errback;</span>&nbsp; <span class='diff-add'> //Indicate this module has be initialized</span>&nbsp; <span class='diff-add'> this.inited = true;</span>&nbsp; <span class='diff-add'> this.ignore = options.ignore;</span>&nbsp; <span class='diff-add'> //Could have option to init this module in enabled mode,</span>&nbsp; <span class='diff-add'> //or could have been previously marked as enabled. However,</span>&nbsp; <span class='diff-add'> //the dependencies are not known until init is called. So</span>&nbsp; <span class='diff-add'> //if enabled previously, now trigger dependencies as enabled.</span>&nbsp; <span class='diff-add'> if (options.enabled || this.enabled) {</span>&nbsp; <span class='diff-add'> //Enable this module and dependencies.</span>&nbsp; <span class='diff-add'> //Will call this.check()</span>&nbsp; <span class='diff-add'> this.enable();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.check();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> defineDep: function (i, depExports) {</span>&nbsp; <span class='diff-add'> //Because of cycles, defined callback for a given</span>&nbsp; <span class='diff-add'> //export can be called more than once.</span>&nbsp; <span class='diff-add'> if (!this.depMatched[i]) {</span>&nbsp; <span class='diff-add'> this.depMatched[i] = true;</span>&nbsp; <span class='diff-add'> this.depCount -= 1;</span>&nbsp; <span class='diff-add'> this.depExports[i] = depExports;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> fetch: function () {</span>&nbsp; <span class='diff-add'> if (this.fetched) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.fetched = true;</span>&nbsp; <span class='diff-add'> context.startTime = (new Date()).getTime();</span>&nbsp; <span class='diff-add'> var map = this.map;</span>&nbsp; <span class='diff-add'> //If the manager is for a plugin managed resource,</span>&nbsp; <span class='diff-add'> //ask the plugin to load it now.</span>&nbsp; <span class='diff-add'> if (this.shim) {</span>&nbsp; <span class='diff-add'> context.makeRequire(this.map, {</span>&nbsp; <span class='diff-add'> enableBuildCallback: true</span>&nbsp; <span class='diff-add'> })(this.shim.deps || [], bind(this, function () {</span>&nbsp; <span class='diff-add'> return map.prefix ? this.callPlugin() : this.load();</span>&nbsp; <span class='diff-add'> }));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> //Regular dependency.</span>&nbsp; <span class='diff-add'> return map.prefix ? this.callPlugin() : this.load();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> load: function () {</span>&nbsp; <span class='diff-add'> var url = this.map.url;</span>&nbsp; <span class='diff-add'> //Regular dependency.</span>&nbsp; <span class='diff-add'> if (!urlFetched[url]) {</span>&nbsp; <span class='diff-add'> urlFetched[url] = true;</span>&nbsp; <span class='diff-add'> context.load(this.map.id, url);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Checks if the module is ready to define itself, and if so,</span>&nbsp; <span class='diff-add'> * define it.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> check: function () {</span>&nbsp; <span class='diff-add'> if (!this.enabled || this.enabling) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var err, cjsModule,</span>&nbsp; <span class='diff-add'> id = this.map.id,</span>&nbsp; <span class='diff-add'> depExports = this.depExports,</span>&nbsp; <span class='diff-add'> exports = this.exports,</span>&nbsp; <span class='diff-add'> factory = this.factory;</span>&nbsp; <span class='diff-add'> if (!this.inited) {</span>&nbsp; <span class='diff-add'> this.fetch();</span>&nbsp; <span class='diff-add'> } else if (this.error) {</span>&nbsp; <span class='diff-add'> this.emit('error', this.error);</span>&nbsp; <span class='diff-add'> } else if (!this.defining) {</span>&nbsp; <span class='diff-add'> //The factory could trigger another require call</span>&nbsp; <span class='diff-add'> //that would result in checking this module to</span>&nbsp; <span class='diff-add'> //define itself again. If already in the process</span>&nbsp; <span class='diff-add'> //of doing that, skip this work.</span>&nbsp; <span class='diff-add'> this.defining = true;</span>&nbsp; <span class='diff-add'> if (this.depCount < 1 && !this.defined) {</span>&nbsp; <span class='diff-add'> if (isFunction(factory)) {</span>&nbsp; <span class='diff-add'> //If there is an error listener, favor passing</span>&nbsp; <span class='diff-add'> //to that instead of throwing an error. However,</span>&nbsp; <span class='diff-add'> //only do it for define()'d modules. require</span>&nbsp; <span class='diff-add'> //errbacks should not be called for failures in</span>&nbsp; <span class='diff-add'> //their callbacks (#699). However if a global</span>&nbsp; <span class='diff-add'> //onError is set, use that.</span>&nbsp; <span class='diff-add'> if ((this.events.error && this.map.isDefine) ||</span>&nbsp; <span class='diff-add'> req.onError !== defaultOnError) {</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> exports = context.execCb(id, factory, depExports, exports);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> err = e;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> exports = context.execCb(id, factory, depExports, exports);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Favor return value over exports. If node/cjs in play,</span>&nbsp; <span class='diff-add'> // then will not have a return value anyway. Favor</span>&nbsp; <span class='diff-add'> // module.exports assignment over exports object.</span>&nbsp; <span class='diff-add'> if (this.map.isDefine && exports === undefined) {</span>&nbsp; <span class='diff-add'> cjsModule = this.module;</span>&nbsp; <span class='diff-add'> if (cjsModule) {</span>&nbsp; <span class='diff-add'> exports = cjsModule.exports;</span>&nbsp; <span class='diff-add'> } else if (this.usingExports) {</span>&nbsp; <span class='diff-add'> //exports already set the defined value.</span>&nbsp; <span class='diff-add'> exports = this.exports;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (err) {</span>&nbsp; <span class='diff-add'> err.requireMap = this.map;</span>&nbsp; <span class='diff-add'> err.requireModules = this.map.isDefine ? [this.map.id] : null;</span>&nbsp; <span class='diff-add'> err.requireType = this.map.isDefine ? 'define' : 'require';</span>&nbsp; <span class='diff-add'> return onError((this.error = err));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> //Just a literal value</span>&nbsp; <span class='diff-add'> exports = factory;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.exports = exports;</span>&nbsp; <span class='diff-add'> if (this.map.isDefine && !this.ignore) {</span>&nbsp; <span class='diff-add'> defined[id] = exports;</span>&nbsp; <span class='diff-add'> if (req.onResourceLoad) {</span>&nbsp; <span class='diff-add'> req.onResourceLoad(context, this.map, this.depMaps);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Clean up</span>&nbsp; <span class='diff-add'> cleanRegistry(id);</span>&nbsp; <span class='diff-add'> this.defined = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Finished the define stage. Allow calling check again</span>&nbsp; <span class='diff-add'> //to allow define notifications below in the case of a</span>&nbsp; <span class='diff-add'> //cycle.</span>&nbsp; <span class='diff-add'> this.defining = false;</span>&nbsp; <span class='diff-add'> if (this.defined && !this.defineEmitted) {</span>&nbsp; <span class='diff-add'> this.defineEmitted = true;</span>&nbsp; <span class='diff-add'> this.emit('defined', this.exports);</span>&nbsp; <span class='diff-add'> this.defineEmitComplete = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> callPlugin: function () {</span>&nbsp; <span class='diff-add'> var map = this.map,</span>&nbsp; <span class='diff-add'> id = map.id,</span>&nbsp; <span class='diff-add'> //Map already normalized the prefix.</span>&nbsp; <span class='diff-add'> pluginMap = makeModuleMap(map.prefix);</span>&nbsp; <span class='diff-add'> //Mark this as a dependency for this plugin, so it</span>&nbsp; <span class='diff-add'> //can be traced for cycles.</span>&nbsp; <span class='diff-add'> this.depMaps.push(pluginMap);</span>&nbsp; <span class='diff-add'> on(pluginMap, 'defined', bind(this, function (plugin) {</span>&nbsp; <span class='diff-add'> var load, normalizedMap, normalizedMod,</span>&nbsp; <span class='diff-add'> bundleId = getOwn(bundlesMap, this.map.id),</span>&nbsp; <span class='diff-add'> name = this.map.name,</span>&nbsp; <span class='diff-add'> parentName = this.map.parentMap ? this.map.parentMap.name : null,</span>&nbsp; <span class='diff-add'> localRequire = context.makeRequire(map.parentMap, {</span>&nbsp; <span class='diff-add'> enableBuildCallback: true</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> //If current map is not normalized, wait for that</span>&nbsp; <span class='diff-add'> //normalized name to load instead of continuing.</span>&nbsp; <span class='diff-add'> if (this.map.unnormalized) {</span>&nbsp; <span class='diff-add'> //Normalize the ID if the plugin allows it.</span>&nbsp; <span class='diff-add'> if (plugin.normalize) {</span>&nbsp; <span class='diff-add'> name = plugin.normalize(name, function (name) {</span>&nbsp; <span class='diff-add'> return normalize(name, parentName, true);</span>&nbsp; <span class='diff-add'> }) || '';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //prefix and name should already be normalized, no need</span>&nbsp; <span class='diff-add'> //for applying map config again either.</span>&nbsp; <span class='diff-add'> normalizedMap = makeModuleMap(map.prefix + '!' + name,</span>&nbsp; <span class='diff-add'> this.map.parentMap);</span>&nbsp; <span class='diff-add'> on(normalizedMap,</span>&nbsp; <span class='diff-add'> 'defined', bind(this, function (value) {</span>&nbsp; <span class='diff-add'> this.init([], function () { return value; }, null, {</span>&nbsp; <span class='diff-add'> enabled: true,</span>&nbsp; <span class='diff-add'> ignore: true</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }));</span>&nbsp; <span class='diff-add'> normalizedMod = getOwn(registry, normalizedMap.id);</span>&nbsp; <span class='diff-add'> if (normalizedMod) {</span>&nbsp; <span class='diff-add'> //Mark this as a dependency for this plugin, so it</span>&nbsp; <span class='diff-add'> //can be traced for cycles.</span>&nbsp; <span class='diff-add'> this.depMaps.push(normalizedMap);</span>&nbsp; <span class='diff-add'> if (this.events.error) {</span>&nbsp; <span class='diff-add'> normalizedMod.on('error', bind(this, function (err) {</span>&nbsp; <span class='diff-add'> this.emit('error', err);</span>&nbsp; <span class='diff-add'> }));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> normalizedMod.enable();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //If a paths config, then just load that file instead to</span>&nbsp; <span class='diff-add'> //resolve the plugin, as it is built into that paths layer.</span>&nbsp; <span class='diff-add'> if (bundleId) {</span>&nbsp; <span class='diff-add'> this.map.url = context.nameToUrl(bundleId);</span>&nbsp; <span class='diff-add'> this.load();</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> load = bind(this, function (value) {</span>&nbsp; <span class='diff-add'> this.init([], function () { return value; }, null, {</span>&nbsp; <span class='diff-add'> enabled: true</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> load.error = bind(this, function (err) {</span>&nbsp; <span class='diff-add'> this.inited = true;</span>&nbsp; <span class='diff-add'> this.error = err;</span>&nbsp; <span class='diff-add'> err.requireModules = [id];</span>&nbsp; <span class='diff-add'> //Remove temp unnormalized modules for this module,</span>&nbsp; <span class='diff-add'> //since they will never be resolved otherwise now.</span>&nbsp; <span class='diff-add'> eachProp(registry, function (mod) {</span>&nbsp; <span class='diff-add'> if (mod.map.id.indexOf(id + '_unnormalized') === 0) {</span>&nbsp; <span class='diff-add'> cleanRegistry(mod.map.id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> onError(err);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> //Allow plugins to load other code without having to know the</span>&nbsp; <span class='diff-add'> //context or how to 'complete' the load.</span>&nbsp; <span class='diff-add'> load.fromText = bind(this, function (text, textAlt) {</span>&nbsp; <span class='diff-add'> /*jslint evil: true */</span>&nbsp; <span class='diff-add'> var moduleName = map.name,</span>&nbsp; <span class='diff-add'> moduleMap = makeModuleMap(moduleName),</span>&nbsp; <span class='diff-add'> hasInteractive = useInteractive;</span>&nbsp; <span class='diff-add'> //As of 2.1.0, support just passing the text, to reinforce</span>&nbsp; <span class='diff-add'> //fromText only being called once per resource. Still</span>&nbsp; <span class='diff-add'> //support old style of passing moduleName but discard</span>&nbsp; <span class='diff-add'> //that moduleName in favor of the internal ref.</span>&nbsp; <span class='diff-add'> if (textAlt) {</span>&nbsp; <span class='diff-add'> text = textAlt;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Turn off interactive script matching for IE for any define</span>&nbsp; <span class='diff-add'> //calls in the text, then turn it back on at the end.</span>&nbsp; <span class='diff-add'> if (hasInteractive) {</span>&nbsp; <span class='diff-add'> useInteractive = false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Prime the system by creating a module instance for</span>&nbsp; <span class='diff-add'> //it.</span>&nbsp; <span class='diff-add'> getModule(moduleMap);</span>&nbsp; <span class='diff-add'> //Transfer any config to this other module.</span>&nbsp; <span class='diff-add'> if (hasProp(config.config, id)) {</span>&nbsp; <span class='diff-add'> config.config[moduleName] = config.config[id];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> req.exec(text);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> return onError(makeError('fromtexteval',</span>&nbsp; <span class='diff-add'> 'fromText eval for ' + id +</span>&nbsp; <span class='diff-add'> ' failed: ' + e,</span>&nbsp; <span class='diff-add'> e,</span>&nbsp; <span class='diff-add'> [id]));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (hasInteractive) {</span>&nbsp; <span class='diff-add'> useInteractive = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Mark this as a dependency for the plugin</span>&nbsp; <span class='diff-add'> //resource</span>&nbsp; <span class='diff-add'> this.depMaps.push(moduleMap);</span>&nbsp; <span class='diff-add'> //Support anonymous modules.</span>&nbsp; <span class='diff-add'> context.completeLoad(moduleName);</span>&nbsp; <span class='diff-add'> //Bind the value of that module to the value for this</span>&nbsp; <span class='diff-add'> //resource ID.</span>&nbsp; <span class='diff-add'> localRequire([moduleName], load);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> //Use parentName here since the plugin's name is not reliable,</span>&nbsp; <span class='diff-add'> //could be some weird string with no path that actually wants to</span>&nbsp; <span class='diff-add'> //reference the parentName's path.</span>&nbsp; <span class='diff-add'> plugin.load(map.name, localRequire, load, config);</span>&nbsp; <span class='diff-add'> }));</span>&nbsp; <span class='diff-add'> context.enable(pluginMap, this);</span>&nbsp; <span class='diff-add'> this.pluginMaps[pluginMap.id] = pluginMap;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> enable: function () {</span>&nbsp; <span class='diff-add'> enabledRegistry[this.map.id] = this;</span>&nbsp; <span class='diff-add'> this.enabled = true;</span>&nbsp; <span class='diff-add'> //Set flag mentioning that the module is enabling,</span>&nbsp; <span class='diff-add'> //so that immediate calls to the defined callbacks</span>&nbsp; <span class='diff-add'> //for dependencies do not trigger inadvertent load</span>&nbsp; <span class='diff-add'> //with the depCount still being zero.</span>&nbsp; <span class='diff-add'> this.enabling = true;</span>&nbsp; <span class='diff-add'> //Enable each dependency</span>&nbsp; <span class='diff-add'> each(this.depMaps, bind(this, function (depMap, i) {</span>&nbsp; <span class='diff-add'> var id, mod, handler;</span>&nbsp; <span class='diff-add'> if (typeof depMap === 'string') {</span>&nbsp; <span class='diff-add'> //Dependency needs to be converted to a depMap</span>&nbsp; <span class='diff-add'> //and wired up to this module.</span>&nbsp; <span class='diff-add'> depMap = makeModuleMap(depMap,</span>&nbsp; <span class='diff-add'> (this.map.isDefine ? this.map : this.map.parentMap),</span>&nbsp; <span class='diff-add'> false,</span>&nbsp; <span class='diff-add'> !this.skipMap);</span>&nbsp; <span class='diff-add'> this.depMaps[i] = depMap;</span>&nbsp; <span class='diff-add'> handler = getOwn(handlers, depMap.id);</span>&nbsp; <span class='diff-add'> if (handler) {</span>&nbsp; <span class='diff-add'> this.depExports[i] = handler(this);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.depCount += 1;</span>&nbsp; <span class='diff-add'> on(depMap, 'defined', bind(this, function (depExports) {</span>&nbsp; <span class='diff-add'> this.defineDep(i, depExports);</span>&nbsp; <span class='diff-add'> this.check();</span>&nbsp; <span class='diff-add'> }));</span>&nbsp; <span class='diff-add'> if (this.errback) {</span>&nbsp; <span class='diff-add'> on(depMap, 'error', bind(this, this.errback));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> id = depMap.id;</span>&nbsp; <span class='diff-add'> mod = registry[id];</span>&nbsp; <span class='diff-add'> //Skip special modules like 'require', 'exports', 'module'</span>&nbsp; <span class='diff-add'> //Also, don't call enable if it is already enabled,</span>&nbsp; <span class='diff-add'> //important in circular dependency cases.</span>&nbsp; <span class='diff-add'> if (!hasProp(handlers, id) && mod && !mod.enabled) {</span>&nbsp; <span class='diff-add'> context.enable(depMap, this);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }));</span>&nbsp; <span class='diff-add'> //Enable each plugin that is used in</span>&nbsp; <span class='diff-add'> //a dependency</span>&nbsp; <span class='diff-add'> eachProp(this.pluginMaps, bind(this, function (pluginMap) {</span>&nbsp; <span class='diff-add'> var mod = getOwn(registry, pluginMap.id);</span>&nbsp; <span class='diff-add'> if (mod && !mod.enabled) {</span>&nbsp; <span class='diff-add'> context.enable(pluginMap, this);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }));</span>&nbsp; <span class='diff-add'> this.enabling = false;</span>&nbsp; <span class='diff-add'> this.check();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> on: function (name, cb) {</span>&nbsp; <span class='diff-add'> var cbs = this.events[name];</span>&nbsp; <span class='diff-add'> if (!cbs) {</span>&nbsp; <span class='diff-add'> cbs = this.events[name] = [];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cbs.push(cb);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> emit: function (name, evt) {</span>&nbsp; <span class='diff-add'> each(this.events[name], function (cb) {</span>&nbsp; <span class='diff-add'> cb(evt);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (name === 'error') {</span>&nbsp; <span class='diff-add'> //Now that the error handler was triggered, remove</span>&nbsp; <span class='diff-add'> //the listeners, since this broken Module instance</span>&nbsp; <span class='diff-add'> //can stay around for a while in the registry.</span>&nbsp; <span class='diff-add'> delete this.events[name];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function callGetModule(args) {</span>&nbsp; <span class='diff-add'> //Skip modules already defined.</span>&nbsp; <span class='diff-add'> if (!hasProp(defined, args[0])) {</span>&nbsp; <span class='diff-add'> getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function removeListener(node, func, name, ieName) {</span>&nbsp; <span class='diff-add'> //Favor detachEvent because of IE9</span>&nbsp; <span class='diff-add'> //issue, see attachEvent/addEventListener comment elsewhere</span>&nbsp; <span class='diff-add'> //in this file.</span>&nbsp; <span class='diff-add'> if (node.detachEvent && !isOpera) {</span>&nbsp; <span class='diff-add'> //Probably IE. If not it will throw an error, which will be</span>&nbsp; <span class='diff-add'> //useful to know.</span>&nbsp; <span class='diff-add'> if (ieName) {</span>&nbsp; <span class='diff-add'> node.detachEvent(ieName, func);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> node.removeEventListener(name, func, false);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Given an event from a script node, get the requirejs info from it,</span>&nbsp; <span class='diff-add'> * and then removes the event listeners on the node.</span>&nbsp; <span class='diff-add'> * @param {Event} evt</span>&nbsp; <span class='diff-add'> * @returns {Object}</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function getScriptData(evt) {</span>&nbsp; <span class='diff-add'> //Using currentTarget instead of target for Firefox 2.0's sake. Not</span>&nbsp; <span class='diff-add'> //all old browsers will be supported, but this one was easy enough</span>&nbsp; <span class='diff-add'> //to support and still makes sense.</span>&nbsp; <span class='diff-add'> var node = evt.currentTarget || evt.srcElement;</span>&nbsp; <span class='diff-add'> //Remove the listeners once here.</span>&nbsp; <span class='diff-add'> removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange');</span>&nbsp; <span class='diff-add'> removeListener(node, context.onScriptError, 'error');</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> node: node,</span>&nbsp; <span class='diff-add'> id: node && node.getAttribute('data-requiremodule')</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function intakeDefines() {</span>&nbsp; <span class='diff-add'> var args;</span>&nbsp; <span class='diff-add'> //Any defined modules in the global queue, intake them now.</span>&nbsp; <span class='diff-add'> takeGlobalQueue();</span>&nbsp; <span class='diff-add'> //Make sure any remaining defQueue items get properly processed.</span>&nbsp; <span class='diff-add'> while (defQueue.length) {</span>&nbsp; <span class='diff-add'> args = defQueue.shift();</span>&nbsp; <span class='diff-add'> if (args[0] === null) {</span>&nbsp; <span class='diff-add'> return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> //args are id, deps, factory. Should be normalized by the</span>&nbsp; <span class='diff-add'> //define() function.</span>&nbsp; <span class='diff-add'> callGetModule(args);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> context = {</span>&nbsp; <span class='diff-add'> config: config,</span>&nbsp; <span class='diff-add'> contextName: contextName,</span>&nbsp; <span class='diff-add'> registry: registry,</span>&nbsp; <span class='diff-add'> defined: defined,</span>&nbsp; <span class='diff-add'> urlFetched: urlFetched,</span>&nbsp; <span class='diff-add'> defQueue: defQueue,</span>&nbsp; <span class='diff-add'> Module: Module,</span>&nbsp; <span class='diff-add'> makeModuleMap: makeModuleMap,</span>&nbsp; <span class='diff-add'> nextTick: req.nextTick,</span>&nbsp; <span class='diff-add'> onError: onError,</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a configuration for the context.</span>&nbsp; <span class='diff-add'> * @param {Object} cfg config object to integrate.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> configure: function (cfg) {</span>&nbsp; <span class='diff-add'> //Make sure the baseUrl ends in a slash.</span>&nbsp; <span class='diff-add'> if (cfg.baseUrl) {</span>&nbsp; <span class='diff-add'> if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') {</span>&nbsp; <span class='diff-add'> cfg.baseUrl += '/';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Save off the paths since they require special processing,</span>&nbsp; <span class='diff-add'> //they are additive.</span>&nbsp; <span class='diff-add'> var shim = config.shim,</span>&nbsp; <span class='diff-add'> objs = {</span>&nbsp; <span class='diff-add'> paths: true,</span>&nbsp; <span class='diff-add'> bundles: true,</span>&nbsp; <span class='diff-add'> config: true,</span>&nbsp; <span class='diff-add'> map: true</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> eachProp(cfg, function (value, prop) {</span>&nbsp; <span class='diff-add'> if (objs[prop]) {</span>&nbsp; <span class='diff-add'> if (!config[prop]) {</span>&nbsp; <span class='diff-add'> config[prop] = {};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> mixin(config[prop], value, true, true);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> config[prop] = value;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> //Reverse map the bundles</span>&nbsp; <span class='diff-add'> if (cfg.bundles) {</span>&nbsp; <span class='diff-add'> eachProp(cfg.bundles, function (value, prop) {</span>&nbsp; <span class='diff-add'> each(value, function (v) {</span>&nbsp; <span class='diff-add'> if (v !== prop) {</span>&nbsp; <span class='diff-add'> bundlesMap[v] = prop;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Merge shim</span>&nbsp; <span class='diff-add'> if (cfg.shim) {</span>&nbsp; <span class='diff-add'> eachProp(cfg.shim, function (value, id) {</span>&nbsp; <span class='diff-add'> //Normalize the structure</span>&nbsp; <span class='diff-add'> if (isArray(value)) {</span>&nbsp; <span class='diff-add'> value = {</span>&nbsp; <span class='diff-add'> deps: value</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if ((value.exports || value.init) && !value.exportsFn) {</span>&nbsp; <span class='diff-add'> value.exportsFn = context.makeShimExports(value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> shim[id] = value;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> config.shim = shim;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Adjust packages if necessary.</span>&nbsp; <span class='diff-add'> if (cfg.packages) {</span>&nbsp; <span class='diff-add'> each(cfg.packages, function (pkgObj) {</span>&nbsp; <span class='diff-add'> var location, name;</span>&nbsp; <span class='diff-add'> pkgObj = typeof pkgObj === 'string' ? { name: pkgObj } : pkgObj;</span>&nbsp; <span class='diff-add'> name = pkgObj.name;</span>&nbsp; <span class='diff-add'> location = pkgObj.location;</span>&nbsp; <span class='diff-add'> if (location) {</span>&nbsp; <span class='diff-add'> config.paths[name] = pkgObj.location;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Save pointer to main module ID for pkg name.</span>&nbsp; <span class='diff-add'> //Remove leading dot in main, so main paths are normalized,</span>&nbsp; <span class='diff-add'> //and remove any trailing .js, since different package</span>&nbsp; <span class='diff-add'> //envs have different conventions: some use a module name,</span>&nbsp; <span class='diff-add'> //some use a file name.</span>&nbsp; <span class='diff-add'> config.pkgs[name] = pkgObj.name + '/' + (pkgObj.main || 'main')</span>&nbsp; <span class='diff-add'> .replace(currDirRegExp, '')</span>&nbsp; <span class='diff-add'> .replace(jsSuffixRegExp, '');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //If there are any "waiting to execute" modules in the registry,</span>&nbsp; <span class='diff-add'> //update the maps for them, since their info, like URLs to load,</span>&nbsp; <span class='diff-add'> //may have changed.</span>&nbsp; <span class='diff-add'> eachProp(registry, function (mod, id) {</span>&nbsp; <span class='diff-add'> //If module already has init called, since it is too</span>&nbsp; <span class='diff-add'> //late to modify them, and ignore unnormalized ones</span>&nbsp; <span class='diff-add'> //since they are transient.</span>&nbsp; <span class='diff-add'> if (!mod.inited && !mod.map.unnormalized) {</span>&nbsp; <span class='diff-add'> mod.map = makeModuleMap(id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> //If a deps array or a config callback is specified, then call</span>&nbsp; <span class='diff-add'> //require with those args. This is useful when require is defined as a</span>&nbsp; <span class='diff-add'> //config object before require.js is loaded.</span>&nbsp; <span class='diff-add'> if (cfg.deps || cfg.callback) {</span>&nbsp; <span class='diff-add'> context.require(cfg.deps || [], cfg.callback);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> makeShimExports: function (value) {</span>&nbsp; <span class='diff-add'> function fn() {</span>&nbsp; <span class='diff-add'> var ret;</span>&nbsp; <span class='diff-add'> if (value.init) {</span>&nbsp; <span class='diff-add'> ret = value.init.apply(global, arguments);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return ret || (value.exports && getGlobal(value.exports));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return fn;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> makeRequire: function (relMap, options) {</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> function localRequire(deps, callback, errback) {</span>&nbsp; <span class='diff-add'> var id, map, requireMod;</span>&nbsp; <span class='diff-add'> if (options.enableBuildCallback && callback && isFunction(callback)) {</span>&nbsp; <span class='diff-add'> callback.__requireJsBuild = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (typeof deps === 'string') {</span>&nbsp; <span class='diff-add'> if (isFunction(callback)) {</span>&nbsp; <span class='diff-add'> //Invalid call</span>&nbsp; <span class='diff-add'> return onError(makeError('requireargs', 'Invalid require call'), errback);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //If require|exports|module are requested, get the</span>&nbsp; <span class='diff-add'> //value for them from the special handlers. Caveat:</span>&nbsp; <span class='diff-add'> //this only works while module is being defined.</span>&nbsp; <span class='diff-add'> if (relMap && hasProp(handlers, deps)) {</span>&nbsp; <span class='diff-add'> return handlers[deps](registry[relMap.id]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Synchronous access to one module. If require.get is</span>&nbsp; <span class='diff-add'> //available (as in the Node adapter), prefer that.</span>&nbsp; <span class='diff-add'> if (req.get) {</span>&nbsp; <span class='diff-add'> return req.get(context, deps, relMap, localRequire);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Normalize module name, if it contains . or ..</span>&nbsp; <span class='diff-add'> map = makeModuleMap(deps, relMap, false, true);</span>&nbsp; <span class='diff-add'> id = map.id;</span>&nbsp; <span class='diff-add'> if (!hasProp(defined, id)) {</span>&nbsp; <span class='diff-add'> return onError(makeError('notloaded', 'Module name "' +</span>&nbsp; <span class='diff-add'> id +</span>&nbsp; <span class='diff-add'> '" has not been loaded yet for context: ' +</span>&nbsp; <span class='diff-add'> contextName +</span>&nbsp; <span class='diff-add'> (relMap ? '' : '. Use require([])')));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return defined[id];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Grab defines waiting in the global queue.</span>&nbsp; <span class='diff-add'> intakeDefines();</span>&nbsp; <span class='diff-add'> //Mark all the dependencies as needing to be loaded.</span>&nbsp; <span class='diff-add'> context.nextTick(function () {</span>&nbsp; <span class='diff-add'> //Some defines could have been added since the</span>&nbsp; <span class='diff-add'> //require call, collect them.</span>&nbsp; <span class='diff-add'> intakeDefines();</span>&nbsp; <span class='diff-add'> requireMod = getModule(makeModuleMap(null, relMap));</span>&nbsp; <span class='diff-add'> //Store if map config should be applied to this require</span>&nbsp; <span class='diff-add'> //call for dependencies.</span>&nbsp; <span class='diff-add'> requireMod.skipMap = options.skipMap;</span>&nbsp; <span class='diff-add'> requireMod.init(deps, callback, errback, {</span>&nbsp; <span class='diff-add'> enabled: true</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> checkLoaded();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return localRequire;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> mixin(localRequire, {</span>&nbsp; <span class='diff-add'> isBrowser: isBrowser,</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Converts a module name + .extension into an URL path.</span>&nbsp; <span class='diff-add'> * *Requires* the use of a module name. It does not support using</span>&nbsp; <span class='diff-add'> * plain URLs like nameToUrl.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> toUrl: function (moduleNamePlusExt) {</span>&nbsp; <span class='diff-add'> var ext,</span>&nbsp; <span class='diff-add'> index = moduleNamePlusExt.lastIndexOf('.'),</span>&nbsp; <span class='diff-add'> segment = moduleNamePlusExt.split('/')[0],</span>&nbsp; <span class='diff-add'> isRelative = segment === '.' || segment === '..';</span>&nbsp; <span class='diff-add'> //Have a file extension alias, and it is not the</span>&nbsp; <span class='diff-add'> //dots from a relative path.</span>&nbsp; <span class='diff-add'> if (index !== -1 && (!isRelative || index > 1)) {</span>&nbsp; <span class='diff-add'> ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);</span>&nbsp; <span class='diff-add'> moduleNamePlusExt = moduleNamePlusExt.substring(0, index);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return context.nameToUrl(normalize(moduleNamePlusExt,</span>&nbsp; <span class='diff-add'> relMap && relMap.id, true), ext, true);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> defined: function (id) {</span>&nbsp; <span class='diff-add'> return hasProp(defined, makeModuleMap(id, relMap, false, true).id);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> specified: function (id) {</span>&nbsp; <span class='diff-add'> id = makeModuleMap(id, relMap, false, true).id;</span>&nbsp; <span class='diff-add'> return hasProp(defined, id) || hasProp(registry, id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> //Only allow undef on top level require calls</span>&nbsp; <span class='diff-add'> if (!relMap) {</span>&nbsp; <span class='diff-add'> localRequire.undef = function (id) {</span>&nbsp; <span class='diff-add'> //Bind any waiting define() calls to this context,</span>&nbsp; <span class='diff-add'> //fix for #408</span>&nbsp; <span class='diff-add'> takeGlobalQueue();</span>&nbsp; <span class='diff-add'> var map = makeModuleMap(id, relMap, true),</span>&nbsp; <span class='diff-add'> mod = getOwn(registry, id);</span>&nbsp; <span class='diff-add'> removeScript(id);</span>&nbsp; <span class='diff-add'> delete defined[id];</span>&nbsp; <span class='diff-add'> delete urlFetched[map.url];</span>&nbsp; <span class='diff-add'> delete undefEvents[id];</span>&nbsp; <span class='diff-add'> //Clean queued defines too. Go backwards</span>&nbsp; <span class='diff-add'> //in array so that the splices do not</span>&nbsp; <span class='diff-add'> //mess up the iteration.</span>&nbsp; <span class='diff-add'> eachReverse(defQueue, function(args, i) {</span>&nbsp; <span class='diff-add'> if(args[0] === id) {</span>&nbsp; <span class='diff-add'> defQueue.splice(i, 1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (mod) {</span>&nbsp; <span class='diff-add'> //Hold on to listeners in case the</span>&nbsp; <span class='diff-add'> //module will be attempted to be reloaded</span>&nbsp; <span class='diff-add'> //using a different config.</span>&nbsp; <span class='diff-add'> if (mod.events.defined) {</span>&nbsp; <span class='diff-add'> undefEvents[id] = mod.events;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> cleanRegistry(id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return localRequire;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called to enable a module if it is still in the registry</span>&nbsp; <span class='diff-add'> * awaiting enablement. A second arg, parent, the parent module,</span>&nbsp; <span class='diff-add'> * is passed in for context, when this method is overridden by</span>&nbsp; <span class='diff-add'> * the optimizer. Not shown here to keep code compact.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> enable: function (depMap) {</span>&nbsp; <span class='diff-add'> var mod = getOwn(registry, depMap.id);</span>&nbsp; <span class='diff-add'> if (mod) {</span>&nbsp; <span class='diff-add'> getModule(depMap).enable();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Internal method used by environment adapters to complete a load event.</span>&nbsp; <span class='diff-add'> * A load event could be a script load or just a load pass from a synchronous</span>&nbsp; <span class='diff-add'> * load call.</span>&nbsp; <span class='diff-add'> * @param {String} moduleName the name of the module to potentially complete.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> completeLoad: function (moduleName) {</span>&nbsp; <span class='diff-add'> var found, args, mod,</span>&nbsp; <span class='diff-add'> shim = getOwn(config.shim, moduleName) || {},</span>&nbsp; <span class='diff-add'> shExports = shim.exports;</span>&nbsp; <span class='diff-add'> takeGlobalQueue();</span>&nbsp; <span class='diff-add'> while (defQueue.length) {</span>&nbsp; <span class='diff-add'> args = defQueue.shift();</span>&nbsp; <span class='diff-add'> if (args[0] === null) {</span>&nbsp; <span class='diff-add'> args[0] = moduleName;</span>&nbsp; <span class='diff-add'> //If already found an anonymous module and bound it</span>&nbsp; <span class='diff-add'> //to this name, then this is some other anon module</span>&nbsp; <span class='diff-add'> //waiting for its completeLoad to fire.</span>&nbsp; <span class='diff-add'> if (found) {</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> found = true;</span>&nbsp; <span class='diff-add'> } else if (args[0] === moduleName) {</span>&nbsp; <span class='diff-add'> //Found matching define call for this script!</span>&nbsp; <span class='diff-add'> found = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> callGetModule(args);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Do this after the cycle of callGetModule in case the result</span>&nbsp; <span class='diff-add'> //of those calls/init calls changes the registry.</span>&nbsp; <span class='diff-add'> mod = getOwn(registry, moduleName);</span>&nbsp; <span class='diff-add'> if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) {</span>&nbsp; <span class='diff-add'> if (config.enforceDefine && (!shExports || !getGlobal(shExports))) {</span>&nbsp; <span class='diff-add'> if (hasPathFallback(moduleName)) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return onError(makeError('nodefine',</span>&nbsp; <span class='diff-add'> 'No define call for ' + moduleName,</span>&nbsp; <span class='diff-add'> null,</span>&nbsp; <span class='diff-add'> [moduleName]));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> //A script that does not call define(), so just simulate</span>&nbsp; <span class='diff-add'> //the call for it.</span>&nbsp; <span class='diff-add'> callGetModule([moduleName, (shim.deps || []), shim.exportsFn]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> checkLoaded();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Converts a module name to a file path. Supports cases where</span>&nbsp; <span class='diff-add'> * moduleName may actually be just an URL.</span>&nbsp; <span class='diff-add'> * Note that it **does not** call normalize on the moduleName,</span>&nbsp; <span class='diff-add'> * it is assumed to have already been normalized. This is an</span>&nbsp; <span class='diff-add'> * internal API, not a public one. Use toUrl for the public API.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> nameToUrl: function (moduleName, ext, skipExt) {</span>&nbsp; <span class='diff-add'> var paths, syms, i, parentModule, url,</span>&nbsp; <span class='diff-add'> parentPath, bundleId,</span>&nbsp; <span class='diff-add'> pkgMain = getOwn(config.pkgs, moduleName);</span>&nbsp; <span class='diff-add'> if (pkgMain) {</span>&nbsp; <span class='diff-add'> moduleName = pkgMain;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> bundleId = getOwn(bundlesMap, moduleName);</span>&nbsp; <span class='diff-add'> if (bundleId) {</span>&nbsp; <span class='diff-add'> return context.nameToUrl(bundleId, ext, skipExt);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //If a colon is in the URL, it indicates a protocol is used and it is just</span>&nbsp; <span class='diff-add'> //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)</span>&nbsp; <span class='diff-add'> //or ends with .js, then assume the user meant to use an url and not a module id.</span>&nbsp; <span class='diff-add'> //The slash is important for protocol-less URLs as well as full paths.</span>&nbsp; <span class='diff-add'> if (req.jsExtRegExp.test(moduleName)) {</span>&nbsp; <span class='diff-add'> //Just a plain path, not module name lookup, so just return it.</span>&nbsp; <span class='diff-add'> //Add extension if it is included. This is a bit wonky, only non-.js things pass</span>&nbsp; <span class='diff-add'> //an extension, this method probably needs to be reworked.</span>&nbsp; <span class='diff-add'> url = moduleName + (ext || '');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> //A module that needs to be converted to a path.</span>&nbsp; <span class='diff-add'> paths = config.paths;</span>&nbsp; <span class='diff-add'> syms = moduleName.split('/');</span>&nbsp; <span class='diff-add'> //For each module name segment, see if there is a path</span>&nbsp; <span class='diff-add'> //registered for it. Start with most specific name</span>&nbsp; <span class='diff-add'> //and work up from it.</span>&nbsp; <span class='diff-add'> for (i = syms.length; i > 0; i -= 1) {</span>&nbsp; <span class='diff-add'> parentModule = syms.slice(0, i).join('/');</span>&nbsp; <span class='diff-add'> parentPath = getOwn(paths, parentModule);</span>&nbsp; <span class='diff-add'> if (parentPath) {</span>&nbsp; <span class='diff-add'> //If an array, it means there are a few choices,</span>&nbsp; <span class='diff-add'> //Choose the one that is desired</span>&nbsp; <span class='diff-add'> if (isArray(parentPath)) {</span>&nbsp; <span class='diff-add'> parentPath = parentPath[0];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> syms.splice(0, i, parentPath);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Join the path parts together, then figure out if baseUrl is needed.</span>&nbsp; <span class='diff-add'> url = syms.join('/');</span>&nbsp; <span class='diff-add'> url += (ext || (/^data\:|\?/.test(url) || skipExt ? '' : '.js'));</span>&nbsp; <span class='diff-add'> url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return config.urlArgs ? url +</span>&nbsp; <span class='diff-add'> ((url.indexOf('?') === -1 ? '?' : '&') +</span>&nbsp; <span class='diff-add'> config.urlArgs) : url;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> //Delegates to req.load. Broken out as a separate function to</span>&nbsp; <span class='diff-add'> //allow overriding in the optimizer.</span>&nbsp; <span class='diff-add'> load: function (id, url) {</span>&nbsp; <span class='diff-add'> req.load(context, id, url);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Executes a module callback function. Broken out as a separate function</span>&nbsp; <span class='diff-add'> * solely to allow the build system to sequence the files in the built</span>&nbsp; <span class='diff-add'> * layer in the right sequence.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> execCb: function (name, callback, args, exports) {</span>&nbsp; <span class='diff-add'> return callback.apply(exports, args);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * callback for script loads, used to check status of loading.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param {Event} evt the event from the browser for the script</span>&nbsp; <span class='diff-add'> * that was loaded.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> onScriptLoad: function (evt) {</span>&nbsp; <span class='diff-add'> //Using currentTarget instead of target for Firefox 2.0's sake. Not</span>&nbsp; <span class='diff-add'> //all old browsers will be supported, but this one was easy enough</span>&nbsp; <span class='diff-add'> //to support and still makes sense.</span>&nbsp; <span class='diff-add'> if (evt.type === 'load' ||</span>&nbsp; <span class='diff-add'> (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) {</span>&nbsp; <span class='diff-add'> //Reset interactive script so a script node is not held onto for</span>&nbsp; <span class='diff-add'> //to long.</span>&nbsp; <span class='diff-add'> interactiveScript = null;</span>&nbsp; <span class='diff-add'> //Pull out the name of the module and the context.</span>&nbsp; <span class='diff-add'> var data = getScriptData(evt);</span>&nbsp; <span class='diff-add'> context.completeLoad(data.id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Callback for script errors.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> onScriptError: function (evt) {</span>&nbsp; <span class='diff-add'> var data = getScriptData(evt);</span>&nbsp; <span class='diff-add'> if (!hasPathFallback(data.id)) {</span>&nbsp; <span class='diff-add'> return onError(makeError('scripterror', 'Script error for: ' + data.id, evt, [data.id]));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> context.require = context.makeRequire();</span>&nbsp; <span class='diff-add'> return context;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Main entry point.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * If the only argument to require is a string, then the module that</span>&nbsp; <span class='diff-add'> * is represented by that string is fetched for the appropriate context.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * If the first argument is an array, then it will be treated as an array</span>&nbsp; <span class='diff-add'> * of dependency string names to fetch. An optional function callback can</span>&nbsp; <span class='diff-add'> * be specified to execute when all of those dependencies are available.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Make a local req variable to help Caja compliance (it assumes things</span>&nbsp; <span class='diff-add'> * on a require that are not standardized), and to give a short</span>&nbsp; <span class='diff-add'> * name for minification/local scope use.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> req = requirejs = function (deps, callback, errback, optional) {</span>&nbsp; <span class='diff-add'> //Find the right context, use default</span>&nbsp; <span class='diff-add'> var context, config,</span>&nbsp; <span class='diff-add'> contextName = defContextName;</span>&nbsp; <span class='diff-add'> // Determine if have config object in the call.</span>&nbsp; <span class='diff-add'> if (!isArray(deps) && typeof deps !== 'string') {</span>&nbsp; <span class='diff-add'> // deps is a config object</span>&nbsp; <span class='diff-add'> config = deps;</span>&nbsp; <span class='diff-add'> if (isArray(callback)) {</span>&nbsp; <span class='diff-add'> // Adjust args if there are dependencies</span>&nbsp; <span class='diff-add'> deps = callback;</span>&nbsp; <span class='diff-add'> callback = errback;</span>&nbsp; <span class='diff-add'> errback = optional;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> deps = [];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (config && config.context) {</span>&nbsp; <span class='diff-add'> contextName = config.context;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> context = getOwn(contexts, contextName);</span>&nbsp; <span class='diff-add'> if (!context) {</span>&nbsp; <span class='diff-add'> context = contexts[contextName] = req.s.newContext(contextName);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (config) {</span>&nbsp; <span class='diff-add'> context.configure(config);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return context.require(deps, callback, errback);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Support require.config() to make it easier to cooperate with other</span>&nbsp; <span class='diff-add'> * AMD loaders on globally agreed names.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> req.config = function (config) {</span>&nbsp; <span class='diff-add'> return req(config);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Execute something after the current tick</span>&nbsp; <span class='diff-add'> * of the event loop. Override for other envs</span>&nbsp; <span class='diff-add'> * that have a better solution than setTimeout.</span>&nbsp; <span class='diff-add'> * @param {Function} fn function to execute later.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {</span>&nbsp; <span class='diff-add'> setTimeout(fn, 4);</span>&nbsp; <span class='diff-add'> } : function (fn) { fn(); };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Export require as a global, but only if it does not already exist.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (!require) {</span>&nbsp; <span class='diff-add'> require = req;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> req.version = version;</span>&nbsp; <span class='diff-add'> //Used to filter out dependencies that are already paths.</span>&nbsp; <span class='diff-add'> req.jsExtRegExp = /^\/|:|\?|\.js$/;</span>&nbsp; <span class='diff-add'> req.isBrowser = isBrowser;</span>&nbsp; <span class='diff-add'> s = req.s = {</span>&nbsp; <span class='diff-add'> contexts: contexts,</span>&nbsp; <span class='diff-add'> newContext: newContext</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //Create default context.</span>&nbsp; <span class='diff-add'> req({});</span>&nbsp; <span class='diff-add'> //Exports some context-sensitive methods on global require.</span>&nbsp; <span class='diff-add'> each([</span>&nbsp; <span class='diff-add'> 'toUrl',</span>&nbsp; <span class='diff-add'> 'undef',</span>&nbsp; <span class='diff-add'> 'defined',</span>&nbsp; <span class='diff-add'> 'specified'</span>&nbsp; <span class='diff-add'> ], function (prop) {</span>&nbsp; <span class='diff-add'> //Reference from contexts instead of early binding to default context,</span>&nbsp; <span class='diff-add'> //so that during builds, the latest instance of the default context</span>&nbsp; <span class='diff-add'> //with its config gets used.</span>&nbsp; <span class='diff-add'> req[prop] = function () {</span>&nbsp; <span class='diff-add'> var ctx = contexts[defContextName];</span>&nbsp; <span class='diff-add'> return ctx.require[prop].apply(ctx, arguments);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (isBrowser) {</span>&nbsp; <span class='diff-add'> head = s.head = document.getElementsByTagName('head')[0];</span>&nbsp; <span class='diff-add'> //If BASE tag is in play, using appendChild is a problem for IE6.</span>&nbsp; <span class='diff-add'> //When that browser dies, this can be removed. Details in this jQuery bug:</span>&nbsp; <span class='diff-add'> //http://dev.jquery.com/ticket/2709</span>&nbsp; <span class='diff-add'> baseElement = document.getElementsByTagName('base')[0];</span>&nbsp; <span class='diff-add'> if (baseElement) {</span>&nbsp; <span class='diff-add'> head = s.head = baseElement.parentNode;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Any errors that require explicitly generates will be passed to this</span>&nbsp; <span class='diff-add'> * function. Intercept/override it if you want custom error handling.</span>&nbsp; <span class='diff-add'> * @param {Error} err the error object.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> req.onError = defaultOnError;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Creates the node for the load command. Only used in browser envs.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> req.createNode = function (config, moduleName, url) {</span>&nbsp; <span class='diff-add'> var node = config.xhtml ?</span>&nbsp; <span class='diff-add'> document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :</span>&nbsp; <span class='diff-add'> document.createElement('script');</span>&nbsp; <span class='diff-add'> node.type = config.scriptType || 'text/javascript';</span>&nbsp; <span class='diff-add'> node.charset = 'utf-8';</span>&nbsp; <span class='diff-add'> node.async = true;</span>&nbsp; <span class='diff-add'> return node;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Does the request to load a module for the browser case.</span>&nbsp; <span class='diff-add'> * Make this a separate function to allow other environments</span>&nbsp; <span class='diff-add'> * to override it.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @param {Object} context the require context to find state.</span>&nbsp; <span class='diff-add'> * @param {String} moduleName the name of the module.</span>&nbsp; <span class='diff-add'> * @param {Object} url the URL to the module.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> req.load = function (context, moduleName, url) {</span>&nbsp; <span class='diff-add'> var config = (context && context.config) || {},</span>&nbsp; <span class='diff-add'> node;</span>&nbsp; <span class='diff-add'> if (isBrowser) {</span>&nbsp; <span class='diff-add'> //In the browser so use a script tag</span>&nbsp; <span class='diff-add'> node = req.createNode(config, moduleName, url);</span>&nbsp; <span class='diff-add'> node.setAttribute('data-requirecontext', context.contextName);</span>&nbsp; <span class='diff-add'> node.setAttribute('data-requiremodule', moduleName);</span>&nbsp; <span class='diff-add'> //Set up load listener. Test attachEvent first because IE9 has</span>&nbsp; <span class='diff-add'> //a subtle issue in its addEventListener and script onload firings</span>&nbsp; <span class='diff-add'> //that do not match the behavior of all other browsers with</span>&nbsp; <span class='diff-add'> //addEventListener support, which fire the onload event for a</span>&nbsp; <span class='diff-add'> //script right after the script execution. See:</span>&nbsp; <span class='diff-add'> //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution</span>&nbsp; <span class='diff-add'> //UNFORTUNATELY Opera implements attachEvent but does not follow the script</span>&nbsp; <span class='diff-add'> //script execution mode.</span>&nbsp; <span class='diff-add'> if (node.attachEvent &&</span>&nbsp; <span class='diff-add'> //Check if node.attachEvent is artificially added by custom script or</span>&nbsp; <span class='diff-add'> //natively supported by browser</span>&nbsp; <span class='diff-add'> //read https://github.com/jrburke/requirejs/issues/187</span>&nbsp; <span class='diff-add'> //if we can NOT find [native code] then it must NOT natively supported.</span>&nbsp; <span class='diff-add'> //in IE8, node.attachEvent does not have toString()</span>&nbsp; <span class='diff-add'> //Note the test for "[native code" with no closing brace, see:</span>&nbsp; <span class='diff-add'> //https://github.com/jrburke/requirejs/issues/273</span>&nbsp; <span class='diff-add'> !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&</span>&nbsp; <span class='diff-add'> !isOpera) {</span>&nbsp; <span class='diff-add'> //Probably IE. IE (at least 6-8) do not fire</span>&nbsp; <span class='diff-add'> //script onload right after executing the script, so</span>&nbsp; <span class='diff-add'> //we cannot tie the anonymous define call to a name.</span>&nbsp; <span class='diff-add'> //However, IE reports the script as being in 'interactive'</span>&nbsp; <span class='diff-add'> //readyState at the time of the define call.</span>&nbsp; <span class='diff-add'> useInteractive = true;</span>&nbsp; <span class='diff-add'> node.attachEvent('onreadystatechange', context.onScriptLoad);</span>&nbsp; <span class='diff-add'> //It would be great to add an error handler here to catch</span>&nbsp; <span class='diff-add'> //404s in IE9+. However, onreadystatechange will fire before</span>&nbsp; <span class='diff-add'> //the error handler, so that does not help. If addEventListener</span>&nbsp; <span class='diff-add'> //is used, then IE will fire error before load, but we cannot</span>&nbsp; <span class='diff-add'> //use that pathway given the connect.microsoft.com issue</span>&nbsp; <span class='diff-add'> //mentioned above about not doing the 'script execute,</span>&nbsp; <span class='diff-add'> //then fire the script load event listener before execute</span>&nbsp; <span class='diff-add'> //next script' that other browsers do.</span>&nbsp; <span class='diff-add'> //Best hope: IE10 fixes the issues,</span>&nbsp; <span class='diff-add'> //and then destroys all installs of IE 6-9.</span>&nbsp; <span class='diff-add'> //node.attachEvent('onerror', context.onScriptError);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> node.addEventListener('load', context.onScriptLoad, false);</span>&nbsp; <span class='diff-add'> node.addEventListener('error', context.onScriptError, false);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> node.src = url;</span>&nbsp; <span class='diff-add'> //For some cache cases in IE 6-8, the script executes before the end</span>&nbsp; <span class='diff-add'> //of the appendChild execution, so to tie an anonymous define</span>&nbsp; <span class='diff-add'> //call to the module name (which is stored on the node), hold on</span>&nbsp; <span class='diff-add'> //to a reference to this node, but clear after the DOM insertion.</span>&nbsp; <span class='diff-add'> currentlyAddingScript = node;</span>&nbsp; <span class='diff-add'> if (baseElement) {</span>&nbsp; <span class='diff-add'> head.insertBefore(node, baseElement);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> head.appendChild(node);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> currentlyAddingScript = null;</span>&nbsp; <span class='diff-add'> return node;</span>&nbsp; <span class='diff-add'> } else if (isWebWorker) {</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> //In a web worker, use importScripts. This is not a very</span>&nbsp; <span class='diff-add'> //efficient use of importScripts, importScripts will block until</span>&nbsp; <span class='diff-add'> //its script is downloaded and evaluated. However, if web workers</span>&nbsp; <span class='diff-add'> //are in play, the expectation that a build has been done so that</span>&nbsp; <span class='diff-add'> //only one script needs to be loaded anyway. This may need to be</span>&nbsp; <span class='diff-add'> //reevaluated if other use cases become common.</span>&nbsp; <span class='diff-add'> importScripts(url);</span>&nbsp; <span class='diff-add'> //Account for anonymous modules</span>&nbsp; <span class='diff-add'> context.completeLoad(moduleName);</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> context.onError(makeError('importscripts',</span>&nbsp; <span class='diff-add'> 'importScripts failed for ' +</span>&nbsp; <span class='diff-add'> moduleName + ' at ' + url,</span>&nbsp; <span class='diff-add'> e,</span>&nbsp; <span class='diff-add'> [moduleName]));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function getInteractiveScript() {</span>&nbsp; <span class='diff-add'> if (interactiveScript && interactiveScript.readyState === 'interactive') {</span>&nbsp; <span class='diff-add'> return interactiveScript;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> eachReverse(scripts(), function (script) {</span>&nbsp; <span class='diff-add'> if (script.readyState === 'interactive') {</span>&nbsp; <span class='diff-add'> return (interactiveScript = script);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return interactiveScript;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Look for a data-main script attribute, which could also adjust the baseUrl.</span>&nbsp; <span class='diff-add'> if (isBrowser && !cfg.skipDataMain) {</span>&nbsp; <span class='diff-add'> //Figure out baseUrl. Get it from the script tag with require.js in it.</span>&nbsp; <span class='diff-add'> eachReverse(scripts(), function (script) {</span>&nbsp; <span class='diff-add'> //Set the 'head' where we can append children by</span>&nbsp; <span class='diff-add'> //using the script's parent.</span>&nbsp; <span class='diff-add'> if (!head) {</span>&nbsp; <span class='diff-add'> head = script.parentNode;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Look for a data-main attribute to set main script for the page</span>&nbsp; <span class='diff-add'> //to load. If it is there, the path to data main becomes the</span>&nbsp; <span class='diff-add'> //baseUrl, if it is not already set.</span>&nbsp; <span class='diff-add'> dataMain = script.getAttribute('data-main');</span>&nbsp; <span class='diff-add'> if (dataMain) {</span>&nbsp; <span class='diff-add'> //Preserve dataMain in case it is a path (i.e. contains '?')</span>&nbsp; <span class='diff-add'> mainScript = dataMain;</span>&nbsp; <span class='diff-add'> //Set final baseUrl if there is not already an explicit one.</span>&nbsp; <span class='diff-add'> if (!cfg.baseUrl) {</span>&nbsp; <span class='diff-add'> //Pull off the directory of data-main for use as the</span>&nbsp; <span class='diff-add'> //baseUrl.</span>&nbsp; <span class='diff-add'> src = mainScript.split('/');</span>&nbsp; <span class='diff-add'> mainScript = src.pop();</span>&nbsp; <span class='diff-add'> subPath = src.length ? src.join('/') + '/' : './';</span>&nbsp; <span class='diff-add'> cfg.baseUrl = subPath;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Strip off any trailing .js since mainScript is now</span>&nbsp; <span class='diff-add'> //like a module name.</span>&nbsp; <span class='diff-add'> mainScript = mainScript.replace(jsSuffixRegExp, '');</span>&nbsp; <span class='diff-add'> //If mainScript is still a path, fall back to dataMain</span>&nbsp; <span class='diff-add'> if (req.jsExtRegExp.test(mainScript)) {</span>&nbsp; <span class='diff-add'> mainScript = dataMain;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Put the data-main script in the files to load.</span>&nbsp; <span class='diff-add'> cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript];</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * The function that handles definitions of modules. Differs from</span>&nbsp; <span class='diff-add'> * require() in that a string for the module should be the first argument,</span>&nbsp; <span class='diff-add'> * and the function to execute after dependencies are loaded should</span>&nbsp; <span class='diff-add'> * return a value to define the module corresponding to the first argument's</span>&nbsp; <span class='diff-add'> * name.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> define = function (name, deps, callback) {</span>&nbsp; <span class='diff-add'> var node, context;</span>&nbsp; <span class='diff-add'> //Allow for anonymous modules</span>&nbsp; <span class='diff-add'> if (typeof name !== 'string') {</span>&nbsp; <span class='diff-add'> //Adjust args appropriately</span>&nbsp; <span class='diff-add'> callback = deps;</span>&nbsp; <span class='diff-add'> deps = name;</span>&nbsp; <span class='diff-add'> name = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //This module may not have dependencies</span>&nbsp; <span class='diff-add'> if (!isArray(deps)) {</span>&nbsp; <span class='diff-add'> callback = deps;</span>&nbsp; <span class='diff-add'> deps = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //If no name, and callback is a function, then figure out if it a</span>&nbsp; <span class='diff-add'> //CommonJS thing with dependencies.</span>&nbsp; <span class='diff-add'> if (!deps && isFunction(callback)) {</span>&nbsp; <span class='diff-add'> deps = [];</span>&nbsp; <span class='diff-add'> //Remove comments from the callback string,</span>&nbsp; <span class='diff-add'> //look for require calls, and pull them into the dependencies,</span>&nbsp; <span class='diff-add'> //but only if there are function args.</span>&nbsp; <span class='diff-add'> if (callback.length) {</span>&nbsp; <span class='diff-add'> callback</span>&nbsp; <span class='diff-add'> .toString()</span>&nbsp; <span class='diff-add'> .replace(commentRegExp, '')</span>&nbsp; <span class='diff-add'> .replace(cjsRequireRegExp, function (match, dep) {</span>&nbsp; <span class='diff-add'> deps.push(dep);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> //May be a CommonJS thing even without require calls, but still</span>&nbsp; <span class='diff-add'> //could use exports, and module. Avoid doing exports and module</span>&nbsp; <span class='diff-add'> //work though if it just needs require.</span>&nbsp; <span class='diff-add'> //REQUIRES the function to expect the CommonJS variables in the</span>&nbsp; <span class='diff-add'> //order listed below.</span>&nbsp; <span class='diff-add'> deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //If in IE 6-8 and hit an anonymous define() call, do the interactive</span>&nbsp; <span class='diff-add'> //work.</span>&nbsp; <span class='diff-add'> if (useInteractive) {</span>&nbsp; <span class='diff-add'> node = currentlyAddingScript || getInteractiveScript();</span>&nbsp; <span class='diff-add'> if (node) {</span>&nbsp; <span class='diff-add'> if (!name) {</span>&nbsp; <span class='diff-add'> name = node.getAttribute('data-requiremodule');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> context = contexts[node.getAttribute('data-requirecontext')];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Always save off evaluating the def call until the script onload handler.</span>&nbsp; <span class='diff-add'> //This allows multiple modules to be in a file without prematurely</span>&nbsp; <span class='diff-add'> //tracing dependencies, and allows for anonymous module support,</span>&nbsp; <span class='diff-add'> //where the module name is not known until the script onload event</span>&nbsp; <span class='diff-add'> //occurs. If no context, use the global queue, and get it processed</span>&nbsp; <span class='diff-add'> //in the onscript load callback.</span>&nbsp; <span class='diff-add'> (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> define.amd = {</span>&nbsp; <span class='diff-add'> jQuery: true</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Executes the text. Normally just uses eval, but can be modified</span>&nbsp; <span class='diff-add'> * to use a better, environment-specific call. Only used for transpiling</span>&nbsp; <span class='diff-add'> * loader plugins, not for plain JS modules.</span>&nbsp; <span class='diff-add'> * @param {String} text the text to execute/evaluate.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> req.exec = function (text) {</span>&nbsp; <span class='diff-add'> /*jslint evil: true */</span>&nbsp; <span class='diff-add'> return eval(text);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //Set up with config info.</span>&nbsp; <span class='diff-add'> req(cfg);</span>&nbsp; <span class='diff-add'>}(this));</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/runmode.js b/ipynb/Array-feature-overlap-05_files/runmode.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..07d2279</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/runmode.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../../lib/codemirror"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../../lib/codemirror"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'>"use strict";</span>&nbsp; <span class='diff-add'>CodeMirror.runMode = function(string, modespec, callback, options) {</span>&nbsp; <span class='diff-add'> var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);</span>&nbsp; <span class='diff-add'> var ie = /MSIE \d/.test(navigator.userAgent);</span>&nbsp; <span class='diff-add'> var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);</span>&nbsp; <span class='diff-add'> if (callback.nodeType == 1) {</span>&nbsp; <span class='diff-add'> var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;</span>&nbsp; <span class='diff-add'> var node = callback, col = 0;</span>&nbsp; <span class='diff-add'> node.innerHTML = "";</span>&nbsp; <span class='diff-add'> callback = function(text, style) {</span>&nbsp; <span class='diff-add'> if (text == "\n") {</span>&nbsp; <span class='diff-add'> // Emitting LF or CRLF on IE8 or earlier results in an incorrect display.</span>&nbsp; <span class='diff-add'> // Emitting a carriage return makes everything ok.</span>&nbsp; <span class='diff-add'> node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text));</span>&nbsp; <span class='diff-add'> col = 0;</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var content = "";</span>&nbsp; <span class='diff-add'> // replace tabs</span>&nbsp; <span class='diff-add'> for (var pos = 0;;) {</span>&nbsp; <span class='diff-add'> var idx = text.indexOf("\t", pos);</span>&nbsp; <span class='diff-add'> if (idx == -1) {</span>&nbsp; <span class='diff-add'> content += text.slice(pos);</span>&nbsp; <span class='diff-add'> col += text.length - pos;</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> col += idx - pos;</span>&nbsp; <span class='diff-add'> content += text.slice(pos, idx);</span>&nbsp; <span class='diff-add'> var size = tabSize - col % tabSize;</span>&nbsp; <span class='diff-add'> col += size;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < size; ++i) content += " ";</span>&nbsp; <span class='diff-add'> pos = idx + 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (style) {</span>&nbsp; <span class='diff-add'> var sp = node.appendChild(document.createElement("span"));</span>&nbsp; <span class='diff-add'> sp.className = "cm-" + style.replace(/ +/g, " cm-");</span>&nbsp; <span class='diff-add'> sp.appendChild(document.createTextNode(content));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> node.appendChild(document.createTextNode(content));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode);</span>&nbsp; <span class='diff-add'> for (var i = 0, e = lines.length; i < e; ++i) {</span>&nbsp; <span class='diff-add'> if (i) callback("\n");</span>&nbsp; <span class='diff-add'> var stream = new CodeMirror.StringStream(lines[i]);</span>&nbsp; <span class='diff-add'> if (!stream.string && mode.blankLine) mode.blankLine(state);</span>&nbsp; <span class='diff-add'> while (!stream.eol()) {</span>&nbsp; <span class='diff-add'> var style = mode.token(stream, state);</span>&nbsp; <span class='diff-add'> callback(stream.current(), style, i, stream.start, state);</span>&nbsp; <span class='diff-add'> stream.start = stream.pos;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'>};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/savewidget.js b/ipynb/Array-feature-overlap-05_files/savewidget.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..d1c6f6e</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/savewidget.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'base/js/dialog',</span>&nbsp; <span class='diff-add'> 'base/js/keyboard',</span>&nbsp; <span class='diff-add'> 'moment',</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils, dialog, keyboard, moment) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var SaveWidget = function (selector, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * TODO: Remove circular ref.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.notebook = undefined;</span>&nbsp; <span class='diff-add'> this.selector = selector;</span>&nbsp; <span class='diff-add'> this.events = options.events;</span>&nbsp; <span class='diff-add'> this._checkpoint_date = undefined;</span>&nbsp; <span class='diff-add'> this.keyboard_manager = options.keyboard_manager;</span>&nbsp; <span class='diff-add'> if (this.selector !== undefined) {</span>&nbsp; <span class='diff-add'> this.element = $(selector);</span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> SaveWidget.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.element.find('span.filename').click(function () {</span>&nbsp; <span class='diff-add'> that.rename_notebook({notebook: that.notebook});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('notebook_loaded.Notebook', function () {</span>&nbsp; <span class='diff-add'> that.update_notebook_name();</span>&nbsp; <span class='diff-add'> that.update_document_title();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('notebook_saved.Notebook', function () {</span>&nbsp; <span class='diff-add'> that.update_notebook_name();</span>&nbsp; <span class='diff-add'> that.update_document_title();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('notebook_renamed.Notebook', function () {</span>&nbsp; <span class='diff-add'> that.update_notebook_name();</span>&nbsp; <span class='diff-add'> that.update_document_title();</span>&nbsp; <span class='diff-add'> that.update_address_bar();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('notebook_save_failed.Notebook', function () {</span>&nbsp; <span class='diff-add'> that.set_save_status('Autosave Failed!');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('notebook_read_only.Notebook', function () {</span>&nbsp; <span class='diff-add'> that.set_save_status('(read only)');</span>&nbsp; <span class='diff-add'> // disable future set_save_status</span>&nbsp; <span class='diff-add'> that.set_save_status = function () {};</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('checkpoints_listed.Notebook', function (event, data) {</span>&nbsp; <span class='diff-add'> that._set_last_checkpoint(data[0]);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('checkpoint_created.Notebook', function (event, data) {</span>&nbsp; <span class='diff-add'> that._set_last_checkpoint(data);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.events.on('set_dirty.Notebook', function (event, data) {</span>&nbsp; <span class='diff-add'> that.set_autosaved(data.value);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> SaveWidget.prototype.rename_notebook = function (options) {</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var dialog_body = $('<div/>').append(</span>&nbsp; <span class='diff-add'> $("<p/>").addClass("rename-message")</span>&nbsp; <span class='diff-add'> .text('Enter a new notebook name:')</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $("<br/>")</span>&nbsp; <span class='diff-add'> ).append(</span>&nbsp; <span class='diff-add'> $('<input/>').attr('type','text').attr('size','25').addClass('form-control')</span>&nbsp; <span class='diff-add'> .val(options.notebook.get_notebook_name())</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> var d = dialog.modal({</span>&nbsp; <span class='diff-add'> title: "Rename Notebook",</span>&nbsp; <span class='diff-add'> body: dialog_body,</span>&nbsp; <span class='diff-add'> notebook: options.notebook,</span>&nbsp; <span class='diff-add'> keyboard_manager: this.keyboard_manager,</span>&nbsp; <span class='diff-add'> buttons : {</span>&nbsp; <span class='diff-add'> "OK": {</span>&nbsp; <span class='diff-add'> class: "btn-primary",</span>&nbsp; <span class='diff-add'> click: function () {</span>&nbsp; <span class='diff-add'> var new_name = d.find('input').val();</span>&nbsp; <span class='diff-add'> if (!options.notebook.test_notebook_name(new_name)) {</span>&nbsp; <span class='diff-add'> d.find('.rename-message').text(</span>&nbsp; <span class='diff-add'> "Invalid notebook name. Notebook names must "+</span>&nbsp; <span class='diff-add'> "have 1 or more characters and can contain any characters " +</span>&nbsp; <span class='diff-add'> "except :/\\. Please enter a new notebook name:"</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> d.find('.rename-message').text("Renaming...");</span>&nbsp; <span class='diff-add'> d.find('input[type="text"]').prop('disabled', true);</span>&nbsp; <span class='diff-add'> that.notebook.rename(new_name).then(</span>&nbsp; <span class='diff-add'> function () {</span>&nbsp; <span class='diff-add'> d.modal('hide');</span>&nbsp; <span class='diff-add'> }, function (error) {</span>&nbsp; <span class='diff-add'> d.find('.rename-message').text(error.message || 'Unknown error');</span>&nbsp; <span class='diff-add'> d.find('input[type="text"]').prop('disabled', false).focus().select();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> "Cancel": {}</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> open : function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Upon ENTER, click the OK button.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> d.find('input[type="text"]').keydown(function (event) {</span>&nbsp; <span class='diff-add'> if (event.which === keyboard.keycodes.enter) {</span>&nbsp; <span class='diff-add'> d.find('.btn-primary').first().click();</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> d.find('input[type="text"]').focus().select();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> SaveWidget.prototype.update_notebook_name = function () {</span>&nbsp; <span class='diff-add'> var nbname = this.notebook.get_notebook_name();</span>&nbsp; <span class='diff-add'> this.element.find('span.filename').text(nbname);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> SaveWidget.prototype.update_document_title = function () {</span>&nbsp; <span class='diff-add'> var nbname = this.notebook.get_notebook_name();</span>&nbsp; <span class='diff-add'> document.title = nbname;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> SaveWidget.prototype.update_address_bar = function(){</span>&nbsp; <span class='diff-add'> var base_url = this.notebook.base_url;</span>&nbsp; <span class='diff-add'> var path = this.notebook.notebook_path;</span>&nbsp; <span class='diff-add'> var state = {path : path};</span>&nbsp; <span class='diff-add'> window.history.replaceState(state, "", utils.url_join_encode(</span>&nbsp; <span class='diff-add'> base_url,</span>&nbsp; <span class='diff-add'> "notebooks",</span>&nbsp; <span class='diff-add'> path)</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> SaveWidget.prototype.set_save_status = function (msg) {</span>&nbsp; <span class='diff-add'> this.element.find('span.autosave_status').text(msg);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> SaveWidget.prototype._set_last_checkpoint = function (checkpoint) {</span>&nbsp; <span class='diff-add'> if (checkpoint) {</span>&nbsp; <span class='diff-add'> this._checkpoint_date = new Date(checkpoint.last_modified);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this._checkpoint_date = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this._render_checkpoint();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> SaveWidget.prototype._render_checkpoint = function () {</span>&nbsp; <span class='diff-add'> /** actually set the text in the element, from our _checkpoint value</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> called directly, and periodically in timeouts.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this._schedule_render_checkpoint();</span>&nbsp; <span class='diff-add'> var el = this.element.find('span.checkpoint_status');</span>&nbsp; <span class='diff-add'> if (!this._checkpoint_date) {</span>&nbsp; <span class='diff-add'> el.text('').attr('title', 'no checkpoint');</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var chkd = moment(this._checkpoint_date);</span>&nbsp; <span class='diff-add'> var long_date = chkd.format('llll');</span>&nbsp; <span class='diff-add'> var human_date;</span>&nbsp; <span class='diff-add'> var tdelta = Math.ceil(new Date() - this._checkpoint_date);</span>&nbsp; <span class='diff-add'> if (tdelta < utils.time.milliseconds.d){</span>&nbsp; <span class='diff-add'> // less than 24 hours old, use relative date</span>&nbsp; <span class='diff-add'> human_date = chkd.fromNow();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // otherwise show calendar </span>&nbsp; <span class='diff-add'> // <Today | yesterday|...> at hh,mm,ss</span>&nbsp; <span class='diff-add'> human_date = chkd.calendar();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> el.text('Last Checkpoint: ' + human_date).attr('title', long_date);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> SaveWidget.prototype._schedule_render_checkpoint = function () {</span>&nbsp; <span class='diff-add'> /** schedule the next update to relative date</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> periodically updated, so short values like 'a few seconds ago' don't get stale.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (!this._checkpoint_date) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if ((this._checkpoint_timeout)) {</span>&nbsp; <span class='diff-add'> clearTimeout(this._checkpoint_timeout);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var dt = Math.ceil(new Date() - this._checkpoint_date);</span>&nbsp; <span class='diff-add'> this._checkpoint_timeout = setTimeout(</span>&nbsp; <span class='diff-add'> $.proxy(this._render_checkpoint, this),</span>&nbsp; <span class='diff-add'> utils.time.timeout_from_dt(dt)</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> SaveWidget.prototype.set_autosaved = function (dirty) {</span>&nbsp; <span class='diff-add'> if (dirty) {</span>&nbsp; <span class='diff-add'> this.set_save_status("(unsaved changes)");</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.set_save_status("(autosaved)");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatibility.</span>&nbsp; <span class='diff-add'> IPython.SaveWidget = SaveWidget;</span>&nbsp; <span class='diff-add'> return {'SaveWidget': SaveWidget};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/scrollmanager.js b/ipynb/Array-feature-overlap-05_files/scrollmanager.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..552b326</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/scrollmanager.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define(['jquery'], function($){</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var ScrollManager = function(notebook, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Public constructor.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.notebook = notebook;</span>&nbsp; <span class='diff-add'> this.element = $('#site');</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> this.animation_speed = options.animation_speed || 250; //ms</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ScrollManager.prototype.scroll = function (delta) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Scroll the document.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters</span>&nbsp; <span class='diff-add'> * ----------</span>&nbsp; <span class='diff-add'> * delta: integer</span>&nbsp; <span class='diff-add'> * direction to scroll the document. Positive is downwards. </span>&nbsp; <span class='diff-add'> * Unit is one page length.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.scroll_some(delta);</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ScrollManager.prototype.scroll_to = function(selector) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Scroll to an element in the notebook.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.element.animate({'scrollTop': $(selector).offset().top + this.element.scrollTop() - this.element.offset().top}, this.animation_speed);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ScrollManager.prototype.scroll_some = function(pages) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Scroll up or down a given number of pages.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters</span>&nbsp; <span class='diff-add'> * ----------</span>&nbsp; <span class='diff-add'> * pages: integer</span>&nbsp; <span class='diff-add'> * number of pages to scroll the document, may be positive or negative.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.element.animate({'scrollTop': this.element.scrollTop() + pages * this.element.height()}, this.animation_speed);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ScrollManager.prototype.get_first_visible_cell = function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Gets the index of the first visible cell in the document.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * First, attempt to be smart by guessing the index of the cell we are</span>&nbsp; <span class='diff-add'> * scrolled to. Then, walk from there up or down until the right cell </span>&nbsp; <span class='diff-add'> * is found. To guess the index, get the top of the last cell, and</span>&nbsp; <span class='diff-add'> * divide that by the number of cells to get an average cell height. </span>&nbsp; <span class='diff-add'> * Then divide the scroll height by the average cell height.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var cell_count = this.notebook.ncells();</span>&nbsp; <span class='diff-add'> var first_cell_top = this.notebook.get_cell(0).element.offset().top;</span>&nbsp; <span class='diff-add'> var last_cell_top = this.notebook.get_cell(cell_count-1).element.offset().top;</span>&nbsp; <span class='diff-add'> var avg_cell_height = (last_cell_top - first_cell_top) / cell_count;</span>&nbsp; <span class='diff-add'> var i = Math.ceil(this.element.scrollTop() / avg_cell_height);</span>&nbsp; <span class='diff-add'> i = Math.min(Math.max(i , 0), cell_count - 1);</span>&nbsp; <span class='diff-add'> while (this.notebook.get_cell(i).element.offset().top - first_cell_top < this.element.scrollTop() && i < cell_count - 1) {</span>&nbsp; <span class='diff-add'> i += 1;</span>&nbsp; <span class='diff-add'> } </span>&nbsp; <span class='diff-add'> while (this.notebook.get_cell(i).element.offset().top - first_cell_top > this.element.scrollTop() - 50 && i >= 0) {</span>&nbsp; <span class='diff-add'> i -= 1;</span>&nbsp; <span class='diff-add'> } </span>&nbsp; <span class='diff-add'> return Math.min(i + 1, cell_count - 1);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var TargetScrollManager = function(notebook, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Public constructor.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> ScrollManager.apply(this, [notebook, options]);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> TargetScrollManager.prototype = Object.create(ScrollManager.prototype);</span>&nbsp; <span class='diff-add'> TargetScrollManager.prototype.is_target = function (index) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Check if a cell should be a scroll stop.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Returns `true` if the cell is a cell that the scroll manager</span>&nbsp; <span class='diff-add'> * should scroll to. Otherwise, false is returned. </span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters</span>&nbsp; <span class='diff-add'> * ----------</span>&nbsp; <span class='diff-add'> * index: integer</span>&nbsp; <span class='diff-add'> * index of the cell to test.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> TargetScrollManager.prototype.scroll = function (delta) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Scroll the document.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters</span>&nbsp; <span class='diff-add'> * ----------</span>&nbsp; <span class='diff-add'> * delta: integer</span>&nbsp; <span class='diff-add'> * direction to scroll the document. Positive is downwards.</span>&nbsp; <span class='diff-add'> * Units are targets.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Try to scroll to the next slide.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var cell_count = this.notebook.ncells();</span>&nbsp; <span class='diff-add'> var selected_index = this.get_first_visible_cell() + delta;</span>&nbsp; <span class='diff-add'> while (0 <= selected_index && selected_index < cell_count && !this.is_target(selected_index)) {</span>&nbsp; <span class='diff-add'> selected_index += delta;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (selected_index < 0 || cell_count <= selected_index) {</span>&nbsp; <span class='diff-add'> return ScrollManager.prototype.scroll.apply(this, [delta]);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.scroll_to(this.notebook.get_cell(selected_index).element);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Cancel browser keyboard scroll.</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var SlideScrollManager = function(notebook, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Public constructor.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> TargetScrollManager.apply(this, [notebook, options]);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> SlideScrollManager.prototype = Object.create(TargetScrollManager.prototype);</span>&nbsp; <span class='diff-add'> SlideScrollManager.prototype.is_target = function (index) {</span>&nbsp; <span class='diff-add'> var cell = this.notebook.get_cell(index);</span>&nbsp; <span class='diff-add'> return cell.metadata && cell.metadata.slideshow && </span>&nbsp; <span class='diff-add'> cell.metadata.slideshow.slide_type && </span>&nbsp; <span class='diff-add'> (cell.metadata.slideshow.slide_type === "slide" ||</span>&nbsp; <span class='diff-add'> cell.metadata.slideshow.slide_type === "subslide");</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var HeadingScrollManager = function(notebook, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Public constructor.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> ScrollManager.apply(this, [notebook, options]);</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> this._level = options.heading_level || 1;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> HeadingScrollManager.prototype = Object.create(ScrollManager.prototype);</span>&nbsp; <span class='diff-add'> HeadingScrollManager.prototype.scroll = function (delta) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Scroll the document.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters</span>&nbsp; <span class='diff-add'> * ----------</span>&nbsp; <span class='diff-add'> * delta: integer</span>&nbsp; <span class='diff-add'> * direction to scroll the document. Positive is downwards.</span>&nbsp; <span class='diff-add'> * Units are headers.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Get all of the header elements that match the heading level or are of</span>&nbsp; <span class='diff-add'> * greater magnitude (a smaller header number).</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var headers = $();</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> for (i = 1; i <= this._level; i++) {</span>&nbsp; <span class='diff-add'> headers = headers.add('#notebook-container h' + i);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Find the header the user is on or below.</span>&nbsp; <span class='diff-add'> var first_cell_top = this.notebook.get_cell(0).element.offset().top;</span>&nbsp; <span class='diff-add'> var current_scroll = this.element.scrollTop();</span>&nbsp; <span class='diff-add'> var header_scroll = 0;</span>&nbsp; <span class='diff-add'> i = -1;</span>&nbsp; <span class='diff-add'> while (current_scroll >= header_scroll && i < headers.length) {</span>&nbsp; <span class='diff-add'> if (++i < headers.length) {</span>&nbsp; <span class='diff-add'> header_scroll = $(headers[i]).offset().top - first_cell_top;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> i--;</span>&nbsp; <span class='diff-add'> // Check if the user is below the header.</span>&nbsp; <span class='diff-add'> if (i < 0 || current_scroll > $(headers[i]).offset().top - first_cell_top + 30) {</span>&nbsp; <span class='diff-add'> // Below the header, count the header as a target.</span>&nbsp; <span class='diff-add'> if (delta < 0) {</span>&nbsp; <span class='diff-add'> delta += 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> i += delta;</span>&nbsp; <span class='diff-add'> // Scroll!</span>&nbsp; <span class='diff-add'> if (0 <= i && i < headers.length) {</span>&nbsp; <span class='diff-add'> this.scroll_to(headers[i]);</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // Default to the base's scroll behavior when target header doesn't</span>&nbsp; <span class='diff-add'> // exist.</span>&nbsp; <span class='diff-add'> return ScrollManager.prototype.scroll.apply(this, [delta]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Return naemspace for require.js loads</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'ScrollManager': ScrollManager,</span>&nbsp; <span class='diff-add'> 'SlideScrollManager': SlideScrollManager,</span>&nbsp; <span class='diff-add'> 'HeadingScrollManager': HeadingScrollManager,</span>&nbsp; <span class='diff-add'> 'TargetScrollManager': TargetScrollManager</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/security.js b/ipynb/Array-feature-overlap-05_files/security.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..11ba8da</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/security.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'components/google-caja/html-css-sanitizer-minified',</span>&nbsp; <span class='diff-add'>], function(IPython, $) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var noop = function (x) { return x; };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var caja;</span>&nbsp; <span class='diff-add'> if (window && window.html) {</span>&nbsp; <span class='diff-add'> caja = window.html;</span>&nbsp; <span class='diff-add'> caja.html4 = window.html4;</span>&nbsp; <span class='diff-add'> caja.sanitizeStylesheet = window.sanitizeStylesheet;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var sanitizeAttribs = function (tagName, attribs, opt_naiveUriRewriter, opt_nmTokenPolicy, opt_logger) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * add trusting data-attributes to the default sanitizeAttribs from caja</span>&nbsp; <span class='diff-add'> * this function is mostly copied from the caja source</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var ATTRIBS = caja.html4.ATTRIBS;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < attribs.length; i += 2) {</span>&nbsp; <span class='diff-add'> var attribName = attribs[i];</span>&nbsp; <span class='diff-add'> if (attribName.substr(0,5) == 'data-') {</span>&nbsp; <span class='diff-add'> var attribKey = '*::' + attribName;</span>&nbsp; <span class='diff-add'> if (!ATTRIBS.hasOwnProperty(attribKey)) {</span>&nbsp; <span class='diff-add'> ATTRIBS[attribKey] = 0;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return caja.sanitizeAttribs(tagName, attribs, opt_naiveUriRewriter, opt_nmTokenPolicy, opt_logger);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var sanitize_css = function (css, tagPolicy) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * sanitize CSS</span>&nbsp; <span class='diff-add'> * like sanitize_html, but for CSS</span>&nbsp; <span class='diff-add'> * called by sanitize_stylesheets</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return caja.sanitizeStylesheet(</span>&nbsp; <span class='diff-add'> window.location.pathname,</span>&nbsp; <span class='diff-add'> css,</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> containerClass: null,</span>&nbsp; <span class='diff-add'> idSuffix: '',</span>&nbsp; <span class='diff-add'> tagPolicy: tagPolicy,</span>&nbsp; <span class='diff-add'> virtualizeAttrName: noop</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> noop</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var sanitize_stylesheets = function (html, tagPolicy) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * sanitize just the css in style tags in a block of html</span>&nbsp; <span class='diff-add'> * called by sanitize_html, if allow_css is true</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var h = $("<div/>").append(html);</span>&nbsp; <span class='diff-add'> var style_tags = h.find("style");</span>&nbsp; <span class='diff-add'> if (!style_tags.length) {</span>&nbsp; <span class='diff-add'> // no style tags to sanitize</span>&nbsp; <span class='diff-add'> return html;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> style_tags.each(function(i, style) {</span>&nbsp; <span class='diff-add'> style.innerHTML = sanitize_css(style.innerHTML, tagPolicy);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return h.html();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var sanitize_html = function (html, allow_css) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * sanitize HTML</span>&nbsp; <span class='diff-add'> * if allow_css is true (default: false), CSS is sanitized as well.</span>&nbsp; <span class='diff-add'> * otherwise, CSS elements and attributes are simply removed.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var html4 = caja.html4;</span>&nbsp; <span class='diff-add'> if (allow_css) {</span>&nbsp; <span class='diff-add'> // allow sanitization of style tags,</span>&nbsp; <span class='diff-add'> // not just scrubbing</span>&nbsp; <span class='diff-add'> html4.ELEMENTS.style &= ~html4.eflags.UNSAFE;</span>&nbsp; <span class='diff-add'> html4.ATTRIBS.style = html4.atype.STYLE;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // scrub all CSS</span>&nbsp; <span class='diff-add'> html4.ELEMENTS.style |= html4.eflags.UNSAFE;</span>&nbsp; <span class='diff-add'> html4.ATTRIBS.style = html4.atype.SCRIPT;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var record_messages = function (msg, opts) {</span>&nbsp; <span class='diff-add'> console.log("HTML Sanitizer", msg, opts);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var policy = function (tagName, attribs) {</span>&nbsp; <span class='diff-add'> if (!(html4.ELEMENTS[tagName] & html4.eflags.UNSAFE)) {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'attribs': sanitizeAttribs(tagName, attribs,</span>&nbsp; <span class='diff-add'> noop, noop, record_messages)</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> record_messages(tagName + " removed", {</span>&nbsp; <span class='diff-add'> change: "removed",</span>&nbsp; <span class='diff-add'> tagName: tagName</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var sanitized = caja.sanitizeWithPolicy(html, policy);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (allow_css) {</span>&nbsp; <span class='diff-add'> // sanitize style tags as stylesheets</span>&nbsp; <span class='diff-add'> sanitized = sanitize_stylesheets(result.sanitized, policy);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> return sanitized;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var security = {</span>&nbsp; <span class='diff-add'> caja: caja,</span>&nbsp; <span class='diff-add'> sanitize_html: sanitize_html</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> IPython.security = security;</span>&nbsp; <span class='diff-add'> return security;</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/serialize.js b/ipynb/Array-feature-overlap-05_files/serialize.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..4da4c9a</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/serialize.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'underscore',</span>&nbsp; <span class='diff-add'> ], function (_) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var _deserialize_array_buffer = function (buf) {</span>&nbsp; <span class='diff-add'> var data = new DataView(buf);</span>&nbsp; <span class='diff-add'> // read the header: 1 + nbufs 32b integers</span>&nbsp; <span class='diff-add'> var nbufs = data.getUint32(0);</span>&nbsp; <span class='diff-add'> var offsets = [];</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> for (i = 1; i <= nbufs; i++) {</span>&nbsp; <span class='diff-add'> offsets.push(data.getUint32(i * 4));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var json_bytes = new Uint8Array(buf.slice(offsets[0], offsets[1]));</span>&nbsp; <span class='diff-add'> var msg = JSON.parse(</span>&nbsp; <span class='diff-add'> (new TextDecoder('utf8')).decode(json_bytes)</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> // the remaining chunks are stored as DataViews in msg.buffers</span>&nbsp; <span class='diff-add'> msg.buffers = [];</span>&nbsp; <span class='diff-add'> var start, stop;</span>&nbsp; <span class='diff-add'> for (i = 1; i < nbufs; i++) {</span>&nbsp; <span class='diff-add'> start = offsets[i];</span>&nbsp; <span class='diff-add'> stop = offsets[i+1] || buf.byteLength;</span>&nbsp; <span class='diff-add'> msg.buffers.push(new DataView(buf.slice(start, stop)));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return msg;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var _deserialize_binary = function(data, callback) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * deserialize the binary message format</span>&nbsp; <span class='diff-add'> * callback will be called with a message whose buffers attribute</span>&nbsp; <span class='diff-add'> * will be an array of DataViews.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (data instanceof Blob) {</span>&nbsp; <span class='diff-add'> // data is Blob, have to deserialize from ArrayBuffer in reader callback</span>&nbsp; <span class='diff-add'> var reader = new FileReader();</span>&nbsp; <span class='diff-add'> reader.onload = function () {</span>&nbsp; <span class='diff-add'> var msg = _deserialize_array_buffer(this.result);</span>&nbsp; <span class='diff-add'> callback(msg);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> reader.readAsArrayBuffer(data);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // data is ArrayBuffer, can deserialize directly</span>&nbsp; <span class='diff-add'> var msg = _deserialize_array_buffer(data);</span>&nbsp; <span class='diff-add'> callback(msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var deserialize = function (data, callback) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * deserialize a message and pass the unpacked message object to callback</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (typeof data === "string") {</span>&nbsp; <span class='diff-add'> // text JSON message</span>&nbsp; <span class='diff-add'> callback(JSON.parse(data));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // binary message</span>&nbsp; <span class='diff-add'> _deserialize_binary(data, callback);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var _serialize_binary = function (msg) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * implement the binary serialization protocol</span>&nbsp; <span class='diff-add'> * serializes JSON message to ArrayBuffer</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> msg = _.clone(msg);</span>&nbsp; <span class='diff-add'> var offsets = [];</span>&nbsp; <span class='diff-add'> var buffers = [];</span>&nbsp; <span class='diff-add'> msg.buffers.map(function (buf) {</span>&nbsp; <span class='diff-add'> buffers.push(buf);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> delete msg.buffers;</span>&nbsp; <span class='diff-add'> var json_utf8 = (new TextEncoder('utf8')).encode(JSON.stringify(msg));</span>&nbsp; <span class='diff-add'> buffers.unshift(json_utf8);</span>&nbsp; <span class='diff-add'> var nbufs = buffers.length;</span>&nbsp; <span class='diff-add'> offsets.push(4 * (nbufs + 1));</span>&nbsp; <span class='diff-add'> var i;</span>&nbsp; <span class='diff-add'> for (i = 0; i + 1 < buffers.length; i++) {</span>&nbsp; <span class='diff-add'> offsets.push(offsets[offsets.length-1] + buffers[i].byteLength);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var msg_buf = new Uint8Array(</span>&nbsp; <span class='diff-add'> offsets[offsets.length-1] + buffers[buffers.length-1].byteLength</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> // use DataView.setUint32 for network byte-order</span>&nbsp; <span class='diff-add'> var view = new DataView(msg_buf.buffer);</span>&nbsp; <span class='diff-add'> // write nbufs to first 4 bytes</span>&nbsp; <span class='diff-add'> view.setUint32(0, nbufs);</span>&nbsp; <span class='diff-add'> // write offsets to next 4 * nbufs bytes</span>&nbsp; <span class='diff-add'> for (i = 0; i < offsets.length; i++) {</span>&nbsp; <span class='diff-add'> view.setUint32(4 * (i+1), offsets[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // write all the buffers at their respective offsets</span>&nbsp; <span class='diff-add'> for (i = 0; i < buffers.length; i++) {</span>&nbsp; <span class='diff-add'> msg_buf.set(new Uint8Array(buffers[i].buffer), offsets[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // return raw ArrayBuffer</span>&nbsp; <span class='diff-add'> return msg_buf.buffer;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var serialize = function (msg) {</span>&nbsp; <span class='diff-add'> if (msg.buffers && msg.buffers.length) {</span>&nbsp; <span class='diff-add'> return _serialize_binary(msg);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return JSON.stringify(msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var exports = {</span>&nbsp; <span class='diff-add'> deserialize : deserialize,</span>&nbsp; <span class='diff-add'> serialize: serialize</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return exports;</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/session.js b/ipynb/Array-feature-overlap-05_files/session.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..5790b6d</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/session.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'services/kernels/kernel',</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils, kernel) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Session object for accessing the session REST api. The session</span>&nbsp; <span class='diff-add'> * should be used to start kernels and then shut them down -- for</span>&nbsp; <span class='diff-add'> * all other operations, the kernel object should be used.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Options should include:</span>&nbsp; <span class='diff-add'> * - notebook_path: the path (not including name) to the notebook</span>&nbsp; <span class='diff-add'> * - kernel_name: the type of kernel (e.g. python3)</span>&nbsp; <span class='diff-add'> * - base_url: the root url of the notebook server</span>&nbsp; <span class='diff-add'> * - ws_url: the url to access websockets</span>&nbsp; <span class='diff-add'> * - notebook: Notebook object</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @class Session</span>&nbsp; <span class='diff-add'> * @param {Object} options</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var Session = function (options) {</span>&nbsp; <span class='diff-add'> this.id = null;</span>&nbsp; <span class='diff-add'> this.notebook_model = {</span>&nbsp; <span class='diff-add'> path: options.notebook_path</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.kernel_model = {</span>&nbsp; <span class='diff-add'> id: null,</span>&nbsp; <span class='diff-add'> name: options.kernel_name</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.base_url = options.base_url;</span>&nbsp; <span class='diff-add'> this.ws_url = options.ws_url;</span>&nbsp; <span class='diff-add'> this.session_service_url = utils.url_join_encode(this.base_url, 'api/sessions');</span>&nbsp; <span class='diff-add'> this.session_url = null;</span>&nbsp; <span class='diff-add'> this.notebook = options.notebook;</span>&nbsp; <span class='diff-add'> this.kernel = null;</span>&nbsp; <span class='diff-add'> this.events = options.notebook.events;</span>&nbsp; <span class='diff-add'> this.bind_events();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Session.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var record_status = function (evt, info) {</span>&nbsp; <span class='diff-add'> console.log('Session: ' + evt.type + ' (' + info.session.id + ')');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.events.on('kernel_created.Session', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_dead.Session', record_status);</span>&nbsp; <span class='diff-add'> this.events.on('kernel_killed.Session', record_status);</span>&nbsp; <span class='diff-add'> // if the kernel dies, then also remove the session</span>&nbsp; <span class='diff-add'> this.events.on('kernel_dead.Kernel', function () {</span>&nbsp; <span class='diff-add'> that.delete();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Public REST api functions</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * GET /api/sessions</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Get a list of the current sessions.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function list</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Session.prototype.list = function (success, error) {</span>&nbsp; <span class='diff-add'> $.ajax(this.session_service_url, {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "GET",</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> success: success,</span>&nbsp; <span class='diff-add'> error: this._on_error(error)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * POST /api/sessions</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Start a new session. This function can only executed once.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function start</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Session.prototype.start = function (success, error) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var on_success = function (data, status, xhr) {</span>&nbsp; <span class='diff-add'> if (that.kernel) {</span>&nbsp; <span class='diff-add'> that.kernel.name = that.kernel_model.name;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> var kernel_service_url = utils.url_path_join(that.base_url, "api/kernels");</span>&nbsp; <span class='diff-add'> that.kernel = new kernel.Kernel(kernel_service_url, that.ws_url, that.notebook, that.kernel_model.name);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> that.events.trigger('kernel_created.Session', {session: that, kernel: that.kernel});</span>&nbsp; <span class='diff-add'> that.kernel._kernel_created(data.kernel);</span>&nbsp; <span class='diff-add'> if (success) {</span>&nbsp; <span class='diff-add'> success(data, status, xhr);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var on_error = function (xhr, status, err) {</span>&nbsp; <span class='diff-add'> that.events.trigger('kernel_dead.Session', {session: that, xhr: xhr, status: status, error: err});</span>&nbsp; <span class='diff-add'> if (error) {</span>&nbsp; <span class='diff-add'> error(xhr, status, err);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> $.ajax(this.session_service_url, {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "POST",</span>&nbsp; <span class='diff-add'> data: JSON.stringify(this._get_model()),</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> success: this._on_success(on_success),</span>&nbsp; <span class='diff-add'> error: this._on_error(on_error)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * GET /api/sessions/[:session_id]</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Get information about a session.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function get_info</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Session.prototype.get_info = function (success, error) {</span>&nbsp; <span class='diff-add'> $.ajax(this.session_url, {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "GET",</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> success: this._on_success(success),</span>&nbsp; <span class='diff-add'> error: this._on_error(error)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * PATCH /api/sessions/[:session_id]</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Rename or move a notebook. If the given name or path are</span>&nbsp; <span class='diff-add'> * undefined, then they will not be changed.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function rename_notebook</span>&nbsp; <span class='diff-add'> * @param {string} [path] - new notebook path</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Session.prototype.rename_notebook = function (path, success, error) {</span>&nbsp; <span class='diff-add'> if (path !== undefined) {</span>&nbsp; <span class='diff-add'> this.notebook_model.path = path;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> $.ajax(this.session_url, {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "PATCH",</span>&nbsp; <span class='diff-add'> data: JSON.stringify(this._get_model()),</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> success: this._on_success(success),</span>&nbsp; <span class='diff-add'> error: this._on_error(error)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * DELETE /api/sessions/[:session_id]</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Kill the kernel and shutdown the session.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function delete</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Session.prototype.delete = function (success, error) {</span>&nbsp; <span class='diff-add'> if (this.kernel) {</span>&nbsp; <span class='diff-add'> this.events.trigger('kernel_killed.Session', {session: this, kernel: this.kernel});</span>&nbsp; <span class='diff-add'> this.kernel._kernel_dead();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> $.ajax(this.session_url, {</span>&nbsp; <span class='diff-add'> processData: false,</span>&nbsp; <span class='diff-add'> cache: false,</span>&nbsp; <span class='diff-add'> type: "DELETE",</span>&nbsp; <span class='diff-add'> dataType: "json",</span>&nbsp; <span class='diff-add'> success: this._on_success(success),</span>&nbsp; <span class='diff-add'> error: this._on_error(error)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Restart the session by deleting it and the starting it</span>&nbsp; <span class='diff-add'> * fresh. If options are given, they can include any of the</span>&nbsp; <span class='diff-add'> * following:</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * - notebook_path - the path to the notebook</span>&nbsp; <span class='diff-add'> * - kernel_name - the name (type) of the kernel</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function restart</span>&nbsp; <span class='diff-add'> * @param {Object} [options] - options for the new kernel</span>&nbsp; <span class='diff-add'> * @param {function} [success] - function executed on ajax success</span>&nbsp; <span class='diff-add'> * @param {function} [error] - functon executed on ajax error</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Session.prototype.restart = function (options, success, error) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var start = function () {</span>&nbsp; <span class='diff-add'> if (options && options.notebook_path) {</span>&nbsp; <span class='diff-add'> that.notebook_model.path = options.notebook_path;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (options && options.kernel_name) {</span>&nbsp; <span class='diff-add'> that.kernel_model.name = options.kernel_name;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> that.kernel_model.id = null;</span>&nbsp; <span class='diff-add'> that.start(success, error);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.delete(start, start);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Helper functions</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get the data model for the session, which includes the notebook path</span>&nbsp; <span class='diff-add'> * and kernel (name and id).</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _get_model</span>&nbsp; <span class='diff-add'> * @returns {Object} - the data model</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Session.prototype._get_model = function () {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> notebook: this.notebook_model,</span>&nbsp; <span class='diff-add'> kernel: this.kernel_model</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the data model from the given JSON object, which should</span>&nbsp; <span class='diff-add'> * have attributes of `id`, `notebook`, and/or `kernel`. If</span>&nbsp; <span class='diff-add'> * provided, the notebook data must include name and path, and the</span>&nbsp; <span class='diff-add'> * kernel data must include name and id.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _update_model</span>&nbsp; <span class='diff-add'> * @param {Object} data - updated data model</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Session.prototype._update_model = function (data) {</span>&nbsp; <span class='diff-add'> if (data && data.id) {</span>&nbsp; <span class='diff-add'> this.id = data.id;</span>&nbsp; <span class='diff-add'> this.session_url = utils.url_join_encode(this.session_service_url, this.id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (data && data.notebook) {</span>&nbsp; <span class='diff-add'> this.notebook_model.path = data.notebook.path;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (data && data.kernel) {</span>&nbsp; <span class='diff-add'> this.kernel_model.name = data.kernel.name;</span>&nbsp; <span class='diff-add'> this.kernel_model.id = data.kernel.id;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle a successful AJAX request by updating the session data</span>&nbsp; <span class='diff-add'> * model with the response, and then optionally calling a provided</span>&nbsp; <span class='diff-add'> * callback.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _on_success</span>&nbsp; <span class='diff-add'> * @param {function} success - callback</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Session.prototype._on_success = function (success) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return function (data, status, xhr) {</span>&nbsp; <span class='diff-add'> that._update_model(data);</span>&nbsp; <span class='diff-add'> if (success) {</span>&nbsp; <span class='diff-add'> success(data, status, xhr);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle a failed AJAX request by logging the error message, and</span>&nbsp; <span class='diff-add'> * then optionally calling a provided callback.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @function _on_error</span>&nbsp; <span class='diff-add'> * @param {function} error - callback</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> Session.prototype._on_error = function (error) {</span>&nbsp; <span class='diff-add'> return function (xhr, status, err) {</span>&nbsp; <span class='diff-add'> utils.log_ajax_error(xhr, status, err);</span>&nbsp; <span class='diff-add'> if (error) {</span>&nbsp; <span class='diff-add'> error(xhr, status, err);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Error type indicating that the session is already starting.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var SessionAlreadyStarting = function (message) {</span>&nbsp; <span class='diff-add'> this.name = "SessionAlreadyStarting";</span>&nbsp; <span class='diff-add'> this.message = (message || "");</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> SessionAlreadyStarting.prototype = Error.prototype;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // For backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.Session = Session;</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> Session: Session,</span>&nbsp; <span class='diff-add'> SessionAlreadyStarting: SessionAlreadyStarting</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/slideshow.js b/ipynb/Array-feature-overlap-05_files/slideshow.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..6b2b35e</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/slideshow.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'notebook/js/celltoolbar',</span>&nbsp; <span class='diff-add'>], function($, celltoolbar) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var CellToolbar = celltoolbar.CellToolbar;</span>&nbsp; <span class='diff-add'> var slideshow_preset = [];</span>&nbsp; <span class='diff-add'> var select_type = CellToolbar.utils.select_ui_generator([</span>&nbsp; <span class='diff-add'> ["-" ,"-" ],</span>&nbsp; <span class='diff-add'> ["Slide" ,"slide" ],</span>&nbsp; <span class='diff-add'> ["Sub-Slide" ,"subslide" ],</span>&nbsp; <span class='diff-add'> ["Fragment" ,"fragment" ],</span>&nbsp; <span class='diff-add'> ["Skip" ,"skip" ],</span>&nbsp; <span class='diff-add'> ["Notes" ,"notes" ],</span>&nbsp; <span class='diff-add'> ],</span>&nbsp; <span class='diff-add'> // setter</span>&nbsp; <span class='diff-add'> function(cell, value){</span>&nbsp; <span class='diff-add'> // we check that the slideshow namespace exist and create it if needed</span>&nbsp; <span class='diff-add'> if (cell.metadata.slideshow === undefined){cell.metadata.slideshow = {};}</span>&nbsp; <span class='diff-add'> // set the value</span>&nbsp; <span class='diff-add'> cell.metadata.slideshow.slide_type = value;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> //geter</span>&nbsp; <span class='diff-add'> function(cell){ var ns = cell.metadata.slideshow;</span>&nbsp; <span class='diff-add'> // if the slideshow namespace does not exist return `undefined`</span>&nbsp; <span class='diff-add'> // (will be interpreted as `false` by checkbox) otherwise</span>&nbsp; <span class='diff-add'> // return the value</span>&nbsp; <span class='diff-add'> return (ns === undefined)? undefined: ns.slide_type;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> "Slide Type");</span>&nbsp; <span class='diff-add'> var register = function (notebook) {</span>&nbsp; <span class='diff-add'> CellToolbar.register_callback('slideshow.select',select_type);</span>&nbsp; <span class='diff-add'> slideshow_preset.push('slideshow.select');</span>&nbsp; <span class='diff-add'> CellToolbar.register_preset('Slideshow',slideshow_preset, notebook);</span>&nbsp; <span class='diff-add'> console.log('Slideshow extension for metadata editing loaded.');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return {'register': register};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/stex.js b/ipynb/Array-feature-overlap-05_files/stex.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..835ed46</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/stex.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>/*</span>&nbsp; <span class='diff-add'> * Author: Constantin Jucovschi ([email protected])</span>&nbsp; <span class='diff-add'> * Licence: MIT</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../../lib/codemirror"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../../lib/codemirror"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> CodeMirror.defineMode("stex", function() {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> function pushCommand(state, command) {</span>&nbsp; <span class='diff-add'> state.cmdState.push(command);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function peekCommand(state) {</span>&nbsp; <span class='diff-add'> if (state.cmdState.length > 0) {</span>&nbsp; <span class='diff-add'> return state.cmdState[state.cmdState.length - 1];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function popCommand(state) {</span>&nbsp; <span class='diff-add'> var plug = state.cmdState.pop();</span>&nbsp; <span class='diff-add'> if (plug) {</span>&nbsp; <span class='diff-add'> plug.closeBracket();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // returns the non-default plugin closest to the end of the list</span>&nbsp; <span class='diff-add'> function getMostPowerful(state) {</span>&nbsp; <span class='diff-add'> var context = state.cmdState;</span>&nbsp; <span class='diff-add'> for (var i = context.length - 1; i >= 0; i--) {</span>&nbsp; <span class='diff-add'> var plug = context[i];</span>&nbsp; <span class='diff-add'> if (plug.name == "DEFAULT") {</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return plug;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return { styleIdentifier: function() { return null; } };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function addPluginPattern(pluginName, cmdStyle, styles) {</span>&nbsp; <span class='diff-add'> return function () {</span>&nbsp; <span class='diff-add'> this.name = pluginName;</span>&nbsp; <span class='diff-add'> this.bracketNo = 0;</span>&nbsp; <span class='diff-add'> this.style = cmdStyle;</span>&nbsp; <span class='diff-add'> this.styles = styles;</span>&nbsp; <span class='diff-add'> this.argument = null; // \begin and \end have arguments that follow. These are stored in the plugin</span>&nbsp; <span class='diff-add'> this.styleIdentifier = function() {</span>&nbsp; <span class='diff-add'> return this.styles[this.bracketNo - 1] || null;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.openBracket = function() {</span>&nbsp; <span class='diff-add'> this.bracketNo++;</span>&nbsp; <span class='diff-add'> return "bracket";</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.closeBracket = function() {};</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var plugins = {};</span>&nbsp; <span class='diff-add'> plugins["importmodule"] = addPluginPattern("importmodule", "tag", ["string", "builtin"]);</span>&nbsp; <span class='diff-add'> plugins["documentclass"] = addPluginPattern("documentclass", "tag", ["", "atom"]);</span>&nbsp; <span class='diff-add'> plugins["usepackage"] = addPluginPattern("usepackage", "tag", ["atom"]);</span>&nbsp; <span class='diff-add'> plugins["begin"] = addPluginPattern("begin", "tag", ["atom"]);</span>&nbsp; <span class='diff-add'> plugins["end"] = addPluginPattern("end", "tag", ["atom"]);</span>&nbsp; <span class='diff-add'> plugins["DEFAULT"] = function () {</span>&nbsp; <span class='diff-add'> this.name = "DEFAULT";</span>&nbsp; <span class='diff-add'> this.style = "tag";</span>&nbsp; <span class='diff-add'> this.styleIdentifier = this.openBracket = this.closeBracket = function() {};</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> function setState(state, f) {</span>&nbsp; <span class='diff-add'> state.f = f;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // called when in a normal (no environment) context</span>&nbsp; <span class='diff-add'> function normal(source, state) {</span>&nbsp; <span class='diff-add'> var plug;</span>&nbsp; <span class='diff-add'> // Do we look like '\command' ? If so, attempt to apply the plugin 'command'</span>&nbsp; <span class='diff-add'> if (source.match(/^\\[a-zA-Z@]+/)) {</span>&nbsp; <span class='diff-add'> var cmdName = source.current().slice(1);</span>&nbsp; <span class='diff-add'> plug = plugins[cmdName] || plugins["DEFAULT"];</span>&nbsp; <span class='diff-add'> plug = new plug();</span>&nbsp; <span class='diff-add'> pushCommand(state, plug);</span>&nbsp; <span class='diff-add'> setState(state, beginParams);</span>&nbsp; <span class='diff-add'> return plug.style;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // escape characters</span>&nbsp; <span class='diff-add'> if (source.match(/^\\[$&%#{}_]/)) {</span>&nbsp; <span class='diff-add'> return "tag";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // white space control characters</span>&nbsp; <span class='diff-add'> if (source.match(/^\\[,;!\/\\]/)) {</span>&nbsp; <span class='diff-add'> return "tag";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // find if we're starting various math modes</span>&nbsp; <span class='diff-add'> if (source.match("\\[")) {</span>&nbsp; <span class='diff-add'> setState(state, function(source, state){ return inMathMode(source, state, "\\]"); });</span>&nbsp; <span class='diff-add'> return "keyword";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (source.match("$$")) {</span>&nbsp; <span class='diff-add'> setState(state, function(source, state){ return inMathMode(source, state, "$$"); });</span>&nbsp; <span class='diff-add'> return "keyword";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (source.match("$")) {</span>&nbsp; <span class='diff-add'> setState(state, function(source, state){ return inMathMode(source, state, "$"); });</span>&nbsp; <span class='diff-add'> return "keyword";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var ch = source.next();</span>&nbsp; <span class='diff-add'> if (ch == "%") {</span>&nbsp; <span class='diff-add'> source.skipToEnd();</span>&nbsp; <span class='diff-add'> return "comment";</span>&nbsp; <span class='diff-add'> } else if (ch == '}' || ch == ']') {</span>&nbsp; <span class='diff-add'> plug = peekCommand(state);</span>&nbsp; <span class='diff-add'> if (plug) {</span>&nbsp; <span class='diff-add'> plug.closeBracket(ch);</span>&nbsp; <span class='diff-add'> setState(state, beginParams);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return "error";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return "bracket";</span>&nbsp; <span class='diff-add'> } else if (ch == '{' || ch == '[') {</span>&nbsp; <span class='diff-add'> plug = plugins["DEFAULT"];</span>&nbsp; <span class='diff-add'> plug = new plug();</span>&nbsp; <span class='diff-add'> pushCommand(state, plug);</span>&nbsp; <span class='diff-add'> return "bracket";</span>&nbsp; <span class='diff-add'> } else if (/\d/.test(ch)) {</span>&nbsp; <span class='diff-add'> source.eatWhile(/[\w.%]/);</span>&nbsp; <span class='diff-add'> return "atom";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> source.eatWhile(/[\w\-_]/);</span>&nbsp; <span class='diff-add'> plug = getMostPowerful(state);</span>&nbsp; <span class='diff-add'> if (plug.name == 'begin') {</span>&nbsp; <span class='diff-add'> plug.argument = source.current();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return plug.styleIdentifier();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function inMathMode(source, state, endModeSeq) {</span>&nbsp; <span class='diff-add'> if (source.eatSpace()) {</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (source.match(endModeSeq)) {</span>&nbsp; <span class='diff-add'> setState(state, normal);</span>&nbsp; <span class='diff-add'> return "keyword";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (source.match(/^\\[a-zA-Z@]+/)) {</span>&nbsp; <span class='diff-add'> return "tag";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (source.match(/^[a-zA-Z]+/)) {</span>&nbsp; <span class='diff-add'> return "variable-2";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // escape characters</span>&nbsp; <span class='diff-add'> if (source.match(/^\\[$&%#{}_]/)) {</span>&nbsp; <span class='diff-add'> return "tag";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // white space control characters</span>&nbsp; <span class='diff-add'> if (source.match(/^\\[,;!\/]/)) {</span>&nbsp; <span class='diff-add'> return "tag";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // special math-mode characters</span>&nbsp; <span class='diff-add'> if (source.match(/^[\^_&]/)) {</span>&nbsp; <span class='diff-add'> return "tag";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // non-special characters</span>&nbsp; <span class='diff-add'> if (source.match(/^[+\-<>|=,\/@!*:;'"`~#?]/)) {</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (source.match(/^(\d+\.\d*|\d*\.\d+|\d+)/)) {</span>&nbsp; <span class='diff-add'> return "number";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var ch = source.next();</span>&nbsp; <span class='diff-add'> if (ch == "{" || ch == "}" || ch == "[" || ch == "]" || ch == "(" || ch == ")") {</span>&nbsp; <span class='diff-add'> return "bracket";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (ch == "%") {</span>&nbsp; <span class='diff-add'> source.skipToEnd();</span>&nbsp; <span class='diff-add'> return "comment";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return "error";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function beginParams(source, state) {</span>&nbsp; <span class='diff-add'> var ch = source.peek(), lastPlug;</span>&nbsp; <span class='diff-add'> if (ch == '{' || ch == '[') {</span>&nbsp; <span class='diff-add'> lastPlug = peekCommand(state);</span>&nbsp; <span class='diff-add'> lastPlug.openBracket(ch);</span>&nbsp; <span class='diff-add'> source.eat(ch);</span>&nbsp; <span class='diff-add'> setState(state, normal);</span>&nbsp; <span class='diff-add'> return "bracket";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (/[ \t\r]/.test(ch)) {</span>&nbsp; <span class='diff-add'> source.eat(ch);</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> setState(state, normal);</span>&nbsp; <span class='diff-add'> popCommand(state);</span>&nbsp; <span class='diff-add'> return normal(source, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> startState: function() {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> cmdState: [],</span>&nbsp; <span class='diff-add'> f: normal</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> copyState: function(s) {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> cmdState: s.cmdState.slice(),</span>&nbsp; <span class='diff-add'> f: s.f</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> token: function(stream, state) {</span>&nbsp; <span class='diff-add'> return state.f(stream, state);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> blankLine: function(state) {</span>&nbsp; <span class='diff-add'> state.f = normal;</span>&nbsp; <span class='diff-add'> state.cmdState.length = 0;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> lineComment: "%"</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> CodeMirror.defineMIME("text/x-stex", "stex");</span>&nbsp; <span class='diff-add'> CodeMirror.defineMIME("text/x-latex", "stex");</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/style.min.css b/ipynb/Array-feature-overlap-05_files/style.min.css</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..d22d07d</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/style.min.css</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>/*!</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>* Twitter Bootstrap</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>*//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.42857143;color:#000;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:3px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:18px;margin-bottom:9px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:9px;margin-bottom:9px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:33px}h2,.h2{font-size:27px}h3,.h3{font-size:23px}h4,.h4{font-size:17px}h5,.h5{font-size:13px}h6,.h6{font-size:12px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:14px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}small,.small{font-size:92%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:9px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:541px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:9px 18px;margin:0 0 18px;font-size:inherit;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:18px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:2px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:1px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;box-shadow:none}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:0;padding-right:0}@media (min-width:768px){.container{width:768px}}@media (min-width:992px){.container{width:940px}}@media (min-width:1200px){.container{width:1140px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:0;padding-right:0}.row{margin-left:0;margin-right:0}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:0;padding-right:0}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:18px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:19.5px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:13px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:32px;padding:6px 12px;font-size:13px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:32px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:45px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:3px}select.input-lg,select.form-group-lg .form-control{height:45px;line-height:45px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:45px;height:45px;line-height:45px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:23px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#404040}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:25px}.form-horizontal .form-group{margin-left:0;margin-right:0}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:0}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:13px;line-height:1.42857143;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:17px;line-height:1.33;border-radius:3px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:1px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:13px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:2px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:541px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:2px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:2px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:3px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:13px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:2px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:1px}.input-group-addon.input-lg{padding:10px 16px;font-size:17px;border-radius:3px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:2px 2px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:2px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:30px;margin-bottom:18px;border:1px solid transparent}@media (min-width:541px){.navbar{border-radius:2px}}@media (min-width:541px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:0;padding-left:0;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:541px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;visibility:visible !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:540px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}@media (min-width:541px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:541px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:541px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:6px 0;font-size:17px;line-height:18px;height:30px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:541px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:0}}.navbar-toggle{position:relative;float:right;margin-right:0;padding:9px 10px;margin-top:-2px;margin-bottom:-2px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:2px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:541px){.navbar-toggle{display:none}}.navbar-nav{margin:3px 0}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width:540px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:18px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:541px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:6px;padding-bottom:6px}}.navbar-form{margin-left:0;margin-right:0;padding:10px 0;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:-1px;margin-bottom:-1px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:540px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:541px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-right-radius:2px;border-top-left-radius:2px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:-1px;margin-bottom:-1px}.navbar-btn.btn-sm{margin-top:0;margin-bottom:0}.navbar-btn.btn-xs{margin-top:4px;margin-bottom:4px}.navbar-text{margin-top:6px;margin-bottom:6px}@media (min-width:541px){.navbar-text{float:left;margin-left:0;margin-right:0}}@media (min-width:541px){.navbar-left{float:left !important;float:left}.navbar-right{float:right !important;float:right;margin-right:0}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:540px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:540px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:18px;list-style:none;background-color:#f5f5f5;border-radius:2px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#5e5e5e}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:2px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:1px;border-top-left-radius:1px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:1px;border-top-right-radius:1px}.pager{padding-left:0;margin:18px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:20px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:3px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:58.5px}}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#000}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:2px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f5f5f5;border-radius:2px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:18px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:2px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:1px;border-top-right-radius:1px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:2px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:3px}.well-sm{padding:9px;border-radius:1px}.close{float:right;font-size:19.5px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:3px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:2px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1.42857143;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:3px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:2px 2px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{transition:transform .6s ease-in-out;backface-visibility:hidden;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after,.item_buttons:before,.item_buttons:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after,.item_buttons:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}/*!</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>* Font Awesome</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>*//*!</span>&nbsp; <span class='diff-add'> * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome</span>&nbsp; <span class='diff-add'> * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)</span>&nbsp; <span class='diff-add'> */@font-face{font-family:'FontAwesome';src:url('../components/font-awesome/fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../components/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../components/font-awesome/fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../components/font-awesome/fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../components/font-awesome/fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../components/font-awesome/fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}/*!</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>* IPython base</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>*/.modal.fade .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}code{color:#000}pre{font-size:inherit;line-height:inherit}label{font-weight:normal}.border-box-sizing{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.corner-all{border-radius:2px}.no-padding{padding:0}.hbox{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.hbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;flex:none}.vbox{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.vbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;flex:none}.hbox.reverse,.vbox.reverse,.reverse{-webkit-box-direction:reverse;-moz-box-direction:reverse;box-direction:reverse;flex-direction:row-reverse}.hbox.box-flex0,.vbox.box-flex0,.box-flex0{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;flex:none;width:auto}.hbox.box-flex1,.vbox.box-flex1,.box-flex1{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}.hbox.box-flex,.vbox.box-flex,.box-flex{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}.hbox.box-flex2,.vbox.box-flex2,.box-flex2{-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;flex:2}.box-group1{-webkit-box-flex-group:1;-moz-box-flex-group:1;box-flex-group:1}.box-group2{-webkit-box-flex-group:2;-moz-box-flex-group:2;box-flex-group:2}.hbox.start,.vbox.start,.start{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;justify-content:flex-start}.hbox.end,.vbox.end,.end{-webkit-box-pack:end;-moz-box-pack:end;box-pack:end;justify-content:flex-end}.hbox.center,.vbox.center,.center{-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;justify-content:center}.hbox.baseline,.vbox.baseline,.baseline{-webkit-box-pack:baseline;-moz-box-pack:baseline;box-pack:baseline;justify-content:baseline}.hbox.stretch,.vbox.stretch,.stretch{-webkit-box-pack:stretch;-moz-box-pack:stretch;box-pack:stretch;justify-content:stretch}.hbox.align-start,.vbox.align-start,.align-start{-webkit-box-align:start;-moz-box-align:start;box-align:start;align-items:flex-start}.hbox.align-end,.vbox.align-end,.align-end{-webkit-box-align:end;-moz-box-align:end;box-align:end;align-items:flex-end}.hbox.align-center,.vbox.align-center,.align-center{-webkit-box-align:center;-moz-box-align:center;box-align:center;align-items:center}.hbox.align-baseline,.vbox.align-baseline,.align-baseline{-webkit-box-align:baseline;-moz-box-align:baseline;box-align:baseline;align-items:baseline}.hbox.align-stretch,.vbox.align-stretch,.align-stretch{-webkit-box-align:stretch;-moz-box-align:stretch;box-align:stretch;align-items:stretch}div.error{margin:2em;text-align:center}div.error>h1{font-size:500%;line-height:normal}div.error>p{font-size:200%;line-height:normal}div.traceback-wrapper{text-align:left;max-width:800px;margin:auto}body{background-color:#fff;position:absolute;left:0;right:0;top:0;bottom:0;overflow:visible}#header{display:none;background-color:#fff;position:relative;z-index:100}#header #header-container{padding-bottom:5px;padding-top:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}#header .header-bar{width:100%;height:1px;background:#e7e7e7;margin-bottom:-1px}@media print{#header{display:none !important}}#header-spacer{width:100%;visibility:hidden}@media print{#header-spacer{display:none}}#ipython_notebook{padding-left:0;padding-top:1px;padding-bottom:1px}@media (max-width:991px){#ipython_notebook{margin-left:10px}}#noscript{width:auto;padding-top:16px;padding-bottom:16px;text-align:center;font-size:22px;color:red;font-weight:bold}#ipython_notebook img{height:28px}#site{width:100%;display:none;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;overflow:auto}@media print{#site{height:auto !important}}.ui-button .ui-button-text{padding:.2em .8em;font-size:77%}input.ui-button{padding:.3em .9em}span#login_widget{float:right}span#login_widget>.button,#logout{color:#333;background-color:#fff;border-color:#ccc}span#login_widget>.button:hover,#logout:hover,span#login_widget>.button:focus,#logout:focus,span#login_widget>.button.focus,#logout.focus,span#login_widget>.button:active,#logout:active,span#login_widget>.button.active,#logout.active,.open>.dropdown-togglespan#login_widget>.button,.open>.dropdown-toggle#logout{color:#333;background-color:#e6e6e6;border-color:#adadad}span#login_widget>.button:active,#logout:active,span#login_widget>.button.active,#logout.active,.open>.dropdown-togglespan#login_widget>.button,.open>.dropdown-toggle#logout{background-image:none}span#login_widget>.button.disabled,#logout.disabled,span#login_widget>.button[disabled],#logout[disabled],fieldset[disabled] span#login_widget>.button,fieldset[disabled] #logout,span#login_widget>.button.disabled:hover,#logout.disabled:hover,span#login_widget>.button[disabled]:hover,#logout[disabled]:hover,fieldset[disabled] span#login_widget>.button:hover,fieldset[disabled] #logout:hover,span#login_widget>.button.disabled:focus,#logout.disabled:focus,span#login_widget>.button[disabled]:focus,#logout[disabled]:focus,fieldset[disabled] span#login_widget>.button:focus,fieldset[disabled] #logout:focus,span#login_widget>.button.disabled.focus,#logout.disabled.focus,span#login_widget>.button[disabled].focus,#logout[disabled].focus,fieldset[disabled] span#login_widget>.button.focus,fieldset[disabled] #logout.focus,span#login_widget>.button.disabled:active,#logout.disabled:active,span#login_widget>.button[disabled]:active,#logout[disabled]:active,fieldset[disabled] span#login_widget>.button:active,fieldset[disabled] #logout:active,span#login_widget>.button.disabled.active,#logout.disabled.active,span#login_widget>.button[disabled].active,#logout[disabled].active,fieldset[disabled] span#login_widget>.button.active,fieldset[disabled] #logout.active{background-color:#fff;border-color:#ccc}span#login_widget>.button .badge,#logout .badge{color:#fff;background-color:#333}.nav-header{text-transform:none}#header>span{margin-top:10px}.modal_stretch .modal-dialog{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;min-height:80%}.modal_stretch .modal-dialog .modal-body{max-height:none;flex:1}@media (min-width:768px){.modal .modal-dialog{width:700px}}@media (min-width:768px){select.form-control{margin-left:12px;margin-right:12px}}/*!</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>* IPython auth</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>*/.center-nav{display:inline-block;margin-bottom:-4px}/*!</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>* IPython tree view</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>*/.alternate_upload{background-color:none;display:inline}.alternate_upload.form{padding:0;margin:0}.alternate_upload input.fileinput{display:inline;opacity:0;z-index:2;width:12ex;margin-right:-12ex}.alternate_upload .input-overlay{display:inline-block;font-weight:bold;line-height:1em}ul#tabs{margin-bottom:4px}ul#tabs a{padding-top:6px;padding-bottom:4px}ul.breadcrumb a:focus,ul.breadcrumb a:hover{text-decoration:none}ul.breadcrumb i.icon-home{font-size:16px;margin-right:4px}ul.breadcrumb span{color:#5e5e5e}.list_toolbar{padding:4px 0 4px 0;vertical-align:middle}.list_toolbar .tree-buttons{padding-top:1px}.dynamic-buttons{display:inline-block}.list_toolbar [class*="span"]{min-height:24px}.list_header{font-weight:bold;background-color:#eee}.list_placeholder{font-weight:bold;padding-top:4px;padding-bottom:4px;padding-left:7px;padding-right:7px}.list_container{margin-top:4px;margin-bottom:20px;border:1px solid #ddd;border-radius:2px}.list_container>div{border-bottom:1px solid #ddd}.list_container>div:hover .list-item{background-color:red}.list_container>div:last-child{border:none}.list_item:hover .list_item{background-color:#ddd}.list_item a{text-decoration:none}.list_item:hover{background-color:#fafafa}.action_col{text-align:right}.list_header>div,.list_item>div{padding-top:4px;padding-bottom:4px;padding-left:7px;padding-right:7px;line-height:22px}.list_header>div input,.list_item>div input{margin-right:7px;margin-left:14px;vertical-align:baseline;line-height:22px;position:relative;top:-1px}.list_header>div .item_link,.list_item>div .item_link{margin-left:-1px;vertical-align:baseline;line-height:22px}.new-file input[type=checkbox]{visibility:hidden}.item_name{line-height:22px;height:24px}.item_icon{font-size:14px;color:#5e5e5e;margin-right:7px;margin-left:7px;line-height:22px;vertical-align:baseline}.item_buttons{padding-top:4px;line-height:1em;margin-left:-5px}.item_buttons .btn-group,.item_buttons .input-group{float:left}.item_buttons>.btn,.item_buttons>.btn-group,.item_buttons>.input-group{margin-left:5px}.item_buttons .btn{min-width:13ex}.item_buttons .running-indicator{color:#5cb85c}.toolbar_info{height:24px;line-height:24px}input.nbname_input,input.engine_num_input{padding-top:3px;padding-bottom:3px;height:22px;line-height:14px;margin:0}input.engine_num_input{width:60px}.highlight_text{color:blue}#project_name{display:inline-block;padding-left:7px;margin-left:-2px}#project_name>.breadcrumb{padding:0;margin-bottom:0;background-color:transparent;font-weight:bold}#tree-selector{display:inline-block;padding-right:0}#tree-selector input[type=checkbox]{margin-left:7px;vertical-align:baseline}.tab-content .row{margin-left:0;margin-right:0}.folder_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f114"}.folder_icon:before.pull-left{margin-right:.3em}.folder_icon:before.pull-right{margin-left:.3em}.notebook_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f02d";position:relative;top:-1px}.notebook_icon:before.pull-left{margin-right:.3em}.notebook_icon:before.pull-right{margin-left:.3em}.running_notebook_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f02d";position:relative;top:-1px;color:#5cb85c}.running_notebook_icon:before.pull-left{margin-right:.3em}.running_notebook_icon:before.pull-right{margin-left:.3em}.file_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f016";position:relative;top:-2px}.file_icon:before.pull-left{margin-right:.3em}.file_icon:before.pull-right{margin-left:.3em}#notebook_toolbar .pull-right{padding-top:0;margin-right:-1px}ul#new-menu{left:auto;right:0}.kernel-menu-icon{padding-right:12px;width:24px;content:"\f096"}.kernel-menu-icon:before{content:"\f096"}.kernel-menu-icon-current:before{content:"\f00c"}#tab_content{padding-top:20px}#running .panel-group .panel{margin-top:3px;margin-bottom:1em}#running .panel-group .panel .panel-heading{background-color:#eee;padding-top:4px;padding-bottom:4px;padding-left:7px;padding-right:7px;line-height:22px}#running .panel-group .panel .panel-heading a:focus,#running .panel-group .panel .panel-heading a:hover{text-decoration:none}#running .panel-group .panel .panel-body{padding:0}#running .panel-group .panel .panel-body .list_container{margin-top:0;margin-bottom:0;border:0;border-radius:0}#running .panel-group .panel .panel-body .list_container .list_item{border-bottom:1px solid #ddd}#running .panel-group .panel .panel-body .list_container .list_item:last-child{border-bottom:0}.delete-button{display:none}.duplicate-button{display:none}.rename-button{display:none}.shutdown-button{display:none}/*!</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>* IPython text editor webapp</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>*/.selected-keymap i.fa{padding:0 5px}.selected-keymap i.fa:before{content:"\f00c"}#mode-menu{overflow:auto;max-height:20em}.edit_app #header{-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2)}.edit_app #menubar .navbar{margin-bottom:-1px}.dirty-indicator{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);width:20px}.dirty-indicator.pull-left{margin-right:.3em}.dirty-indicator.pull-right{margin-left:.3em}.dirty-indicator-dirty{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);width:20px}.dirty-indicator-dirty.pull-left{margin-right:.3em}.dirty-indicator-dirty.pull-right{margin-left:.3em}.dirty-indicator-clean{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);width:20px}.dirty-indicator-clean.pull-left{margin-right:.3em}.dirty-indicator-clean.pull-right{margin-left:.3em}.dirty-indicator-clean:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f00c"}.dirty-indicator-clean:before.pull-left{margin-right:.3em}.dirty-indicator-clean:before.pull-right{margin-left:.3em}#filename{font-size:16pt;display:table;padding:0 5px}#current-mode{padding-left:5px;padding-right:5px}#texteditor-backdrop{padding-top:20px;padding-bottom:20px}@media not print{#texteditor-backdrop{background-color:#eee}}@media print{#texteditor-backdrop #texteditor-container .CodeMirror-gutter,#texteditor-backdrop #texteditor-container .CodeMirror-gutters{background-color:#fff}}@media not print{#texteditor-backdrop #texteditor-container .CodeMirror-gutter,#texteditor-backdrop #texteditor-container .CodeMirror-gutters{background-color:#fff}}@media not print{#texteditor-backdrop #texteditor-container{padding:0;background-color:#fff;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2)}}/*!</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>* IPython notebook</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>*/.ansibold{font-weight:bold}.ansiblack{color:black}.ansired{color:darkred}.ansigreen{color:darkgreen}.ansiyellow{color:#c4a000}.ansiblue{color:darkblue}.ansipurple{color:darkviolet}.ansicyan{color:steelblue}.ansigray{color:gray}.ansibgblack{background-color:black}.ansibgred{background-color:red}.ansibggreen{background-color:green}.ansibgyellow{background-color:yellow}.ansibgblue{background-color:blue}.ansibgpurple{background-color:magenta}.ansibgcyan{background-color:cyan}.ansibggray{background-color:gray}div.cell{border:1px solid transparent;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;border-radius:2px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-width:thin;border-style:solid;width:100%;padding:5px;margin:0;outline:none}div.cell.selected{border-color:#ababab}@media print{div.cell.selected{border-color:transparent}}.edit_mode div.cell.selected{border-color:green}@media print{.edit_mode div.cell.selected{border-color:transparent}}.prompt{min-width:14ex;padding:.4em;margin:0;font-family:monospace;text-align:right;line-height:1.21429em}@media (max-width:540px){.prompt{text-align:left}}div.inner_cell{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}@-moz-document url-prefix(){div.inner_cell{overflow-x:hidden}}div.input_area{border:1px solid #cfcfcf;border-radius:2px;background:#f7f7f7;line-height:1.21429em}div.prompt:empty{padding-top:0;padding-bottom:0}div.unrecognized_cell{padding:5px 5px 5px 0;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}div.unrecognized_cell .inner_cell{border-radius:2px;padding:5px;font-weight:bold;color:red;border:1px solid #cfcfcf;background:#eaeaea}div.unrecognized_cell .inner_cell a{color:inherit;text-decoration:none}div.unrecognized_cell .inner_cell a:hover{color:inherit;text-decoration:none}@media (max-width:540px){div.unrecognized_cell>div.prompt{display:none}}@media print{div.code_cell{page-break-inside:avoid}}div.input{page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}@media (max-width:540px){div.input{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}}div.input_prompt{color:navy;border-top:1px solid transparent}div.input_area>div.highlight{margin:.4em;border:none;padding:0;background-color:transparent}div.input_area>div.highlight>pre{margin:0;border:none;padding:0;background-color:transparent}.CodeMirror{line-height:1.21429em;font-size:14px;height:auto;background:none}.CodeMirror-scroll{overflow-y:hidden;overflow-x:auto}.CodeMirror-lines{padding:.4em}.CodeMirror-linenumber{padding:0 8px 0 4px}.CodeMirror-gutters{border-bottom-left-radius:2px;border-top-left-radius:2px}.CodeMirror pre{padding:0;border:0;border-radius:0}.highlight-base{color:#000}.highlight-variable{color:#000}.highlight-variable-2{color:#1a1a1a}.highlight-variable-3{color:#333}.highlight-string{color:#ba2121}.highlight-comment{color:#408080;font-style:italic}.highlight-number{color:#080}.highlight-atom{color:#88f}.highlight-keyword{color:#008000;font-weight:bold}.highlight-builtin{color:#008000}.highlight-error{color:#f00}.highlight-operator{color:#a2f;font-weight:bold}.highlight-meta{color:#a2f}.highlight-def{color:#00f}.highlight-string-2{color:#f50}.highlight-qualifier{color:#555}.highlight-bracket{color:#997}.highlight-tag{color:#170}.highlight-attribute{color:#00c}.highlight-header{color:blue}.highlight-quote{color:#090}.highlight-link{color:#00c}.cm-s-ipython span.cm-keyword{color:#008000;font-weight:bold}.cm-s-ipython span.cm-atom{color:#88f}.cm-s-ipython span.cm-number{color:#080}.cm-s-ipython span.cm-def{color:#00f}.cm-s-ipython span.cm-variable{color:#000}.cm-s-ipython span.cm-operator{color:#a2f;font-weight:bold}.cm-s-ipython span.cm-variable-2{color:#1a1a1a}.cm-s-ipython span.cm-variable-3{color:#333}.cm-s-ipython span.cm-comment{color:#408080;font-style:italic}.cm-s-ipython span.cm-string{color:#ba2121}.cm-s-ipython span.cm-string-2{color:#f50}.cm-s-ipython span.cm-meta{color:#a2f}.cm-s-ipython span.cm-qualifier{color:#555}.cm-s-ipython span.cm-builtin{color:#008000}.cm-s-ipython span.cm-bracket{color:#997}.cm-s-ipython span.cm-tag{color:#170}.cm-s-ipython span.cm-attribute{color:#00c}.cm-s-ipython span.cm-header{color:blue}.cm-s-ipython span.cm-quote{color:#090}.cm-s-ipython span.cm-link{color:#00c}.cm-s-ipython span.cm-error{color:#f00}.cm-s-ipython span.cm-tab{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);background-position:right;background-repeat:no-repeat}div.output_wrapper{position:relative;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}div.output_scroll{height:24em;width:100%;overflow:auto;border-radius:2px;-webkit-box-shadow:inset 0 2px 8px rgba(0,0,0,0.8);box-shadow:inset 0 2px 8px rgba(0,0,0,0.8);display:block}div.output_collapsed{margin:0;padding:0;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}div.out_prompt_overlay{height:100%;padding:0 .4em;position:absolute;border-radius:2px}div.out_prompt_overlay:hover{-webkit-box-shadow:inset 0 0 1px #000;box-shadow:inset 0 0 1px #000;background:rgba(240,240,240,0.5)}div.output_prompt{color:darkred}div.output_area{padding:0;page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}div.output_area .MathJax_Display{text-align:left !important}div.output_area .rendered_html table{margin-left:0;margin-right:0}div.output_area .rendered_html img{margin-left:0;margin-right:0}.output{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}@media (max-width:540px){div.output_area{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}}div.output_area pre{margin:0;padding:0;border:0;vertical-align:baseline;color:black;background-color:transparent;border-radius:0}div.output_subarea{padding:.4em;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}div.output_text{text-align:left;color:#000;line-height:1.21429em}div.output_stderr{background:#fdd}div.output_latex{text-align:left}div.output_javascript:empty{padding:0}.js-error{color:darkred}div.raw_input_container{font-family:monospace;padding-top:5px}input.raw_input{font-family:inherit;font-size:inherit;color:inherit;width:auto;vertical-align:baseline;padding:0 .25em;margin:0 .25em}input.raw_input:focus{box-shadow:none}p.p-space{margin-bottom:10px}div.output_unrecognized{padding:5px;font-weight:bold;color:red}div.output_unrecognized a{color:inherit;text-decoration:none}div.output_unrecognized a:hover{color:inherit;text-decoration:none}.rendered_html{color:#000}.rendered_html em{font-style:italic}.rendered_html strong{font-weight:bold}.rendered_html u{text-decoration:underline}.rendered_html :link{text-decoration:underline}.rendered_html :visited{text-decoration:underline}.rendered_html h1{font-size:185.7%;margin:1.08em 0 0 0;font-weight:bold;line-height:1}.rendered_html h2{font-size:157.1%;margin:1.27em 0 0 0;font-weight:bold;line-height:1}.rendered_html h3{font-size:128.6%;margin:1.55em 0 0 0;font-weight:bold;line-height:1}.rendered_html h4{font-size:100%;margin:2em 0 0 0;font-weight:bold;line-height:1}.rendered_html h5{font-size:100%;margin:2em 0 0 0;font-weight:bold;line-height:1;font-style:italic}.rendered_html h6{font-size:100%;margin:2em 0 0 0;font-weight:bold;line-height:1;font-style:italic}.rendered_html h1:first-child{margin-top:.538em}.rendered_html h2:first-child{margin-top:.636em}.rendered_html h3:first-child{margin-top:.777em}.rendered_html h4:first-child{margin-top:1em}.rendered_html h5:first-child{margin-top:1em}.rendered_html h6:first-child{margin-top:1em}.rendered_html ul{list-style:disc;margin:0 2em;padding-left:0}.rendered_html ul ul{list-style:square;margin:0 2em}.rendered_html ul ul ul{list-style:circle;margin:0 2em}.rendered_html ol{list-style:decimal;margin:0 2em;padding-left:0}.rendered_html ol ol{list-style:upper-alpha;margin:0 2em}.rendered_html ol ol ol{list-style:lower-alpha;margin:0 2em}.rendered_html ol ol ol ol{list-style:lower-roman;margin:0 2em}.rendered_html ol ol ol ol ol{list-style:decimal;margin:0 2em}.rendered_html *+ul{margin-top:1em}.rendered_html *+ol{margin-top:1em}.rendered_html hr{color:black;background-color:black}.rendered_html pre{margin:1em 2em}.rendered_html pre,.rendered_html code{border:0;background-color:#fff;color:#000;font-size:100%;padding:0}.rendered_html blockquote{margin:1em 2em}.rendered_html table{margin-left:auto;margin-right:auto;border:1px solid black;border-collapse:collapse}.rendered_html tr,.rendered_html th,.rendered_html td{border:1px solid black;border-collapse:collapse;margin:1em 2em}.rendered_html td,.rendered_html th{text-align:left;vertical-align:middle;padding:4px}.rendered_html th{font-weight:bold}.rendered_html *+table{margin-top:1em}.rendered_html p{text-align:left}.rendered_html *+p{margin-top:1em}.rendered_html img{display:block;margin-left:auto;margin-right:auto}.rendered_html *+img{margin-top:1em}div.text_cell{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}@media (max-width:540px){div.text_cell>div.prompt{display:none}}div.text_cell_render{outline:none;resize:none;width:inherit;border-style:none;padding:.5em .5em .5em .4em;color:#000;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}a.anchor-link:link{text-decoration:none;padding:0 20px;visibility:hidden}h1:hover .anchor-link,h2:hover .anchor-link,h3:hover .anchor-link,h4:hover .anchor-link,h5:hover .anchor-link,h6:hover .anchor-link{visibility:visible}.text_cell.rendered .input_area{display:none}.text_cell.unrendered .text_cell_render{display:none}.cm-header-1,.cm-header-2,.cm-header-3,.cm-header-4,.cm-header-5,.cm-header-6{font-weight:bold;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.cm-header-1{font-size:185.7%}.cm-header-2{font-size:157.1%}.cm-header-3{font-size:128.6%}.cm-header-4{font-size:110%}.cm-header-5{font-size:100%;font-style:italic}.cm-header-6{font-size:100%;font-style:italic}.widget-interact>div,.widget-interact>input{padding:2.5px}.widget-area{page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.widget-area .widget-subarea{padding:.44em .4em .4em 1px;margin-left:6px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;flex:2;-webkit-box-align:start;-moz-box-align:start;box-align:start;align-items:flex-start}.widget-area.connection-problems .prompt:after{content:"\f127";font-family:'FontAwesome';color:#d9534f;font-size:14px;top:3px;padding:3px}.slide-track{border:1px solid #ccc;background:#fff;border-radius:2px}.widget-hslider{padding-left:8px;padding-right:2px;overflow:visible;width:350px;height:5px;max-height:5px;margin-top:13px;margin-bottom:10px;border:1px solid #ccc;background:#fff;border-radius:2px;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.widget-hslider .ui-slider{border:0;background:none;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}.widget-hslider .ui-slider .ui-slider-handle{width:12px;height:28px;margin-top:-8px;border-radius:2px}.widget-hslider .ui-slider .ui-slider-range{height:12px;margin-top:-4px;background:#eee}.widget-vslider{padding-bottom:5px;overflow:visible;width:5px;max-width:5px;height:250px;margin-left:12px;border:1px solid #ccc;background:#fff;border-radius:2px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.widget-vslider .ui-slider{border:0;background:none;margin-left:-4px;margin-top:5px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}.widget-vslider .ui-slider .ui-slider-handle{width:28px;height:12px;margin-left:-9px;border-radius:2px}.widget-vslider .ui-slider .ui-slider-range{width:12px;margin-left:-1px;background:#eee}.widget-text{width:350px;margin:0}.widget-listbox{width:350px;margin-bottom:0}.widget-numeric-text{width:150px;margin:0}.widget-progress{margin-top:6px;min-width:350px}.widget-progress .progress-bar{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.widget-combo-btn{min-width:125px}.widget_item .dropdown-menu li a{color:inherit}.widget-hbox{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.widget-hbox input[type="checkbox"]{margin-top:9px;margin-bottom:10px}.widget-hbox .widget-label{min-width:10ex;padding-right:8px;padding-top:5px;text-align:right;vertical-align:text-top}.widget-hbox .widget-readout{padding-left:8px;padding-top:5px;text-align:left;vertical-align:text-top}.widget-vbox{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.widget-vbox .widget-label{padding-bottom:5px;text-align:center;vertical-align:text-bottom}.widget-vbox .widget-readout{padding-top:5px;text-align:center;vertical-align:text-top}.widget-box{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-box-align:start;-moz-box-align:start;box-align:start;align-items:flex-start}.widget-radio-box{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding-top:4px}.widget-radio-box label{margin-top:0}.widget-radio{margin-left:20px}/*!</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>* IPython notebook webapp</span>&nbsp; <span class='diff-add'>*</span>&nbsp; <span class='diff-add'>*/@media (max-width:767px){.notebook_app{padding-left:0;padding-right:0}}#ipython-main-app{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;height:100%}div#notebook_panel{margin:0;padding:0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;height:100%}#notebook{font-size:14px;line-height:20px;overflow-y:hidden;overflow-x:auto;width:100%;padding-top:20px;margin:0;outline:none;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;min-height:100%}@media not print{#notebook-container{padding:15px;background-color:#fff;min-height:0;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2)}}div.ui-widget-content{border:1px solid #ababab;outline:none}pre.dialog{background-color:#f7f7f7;border:1px solid #ddd;border-radius:2px;padding:.4em;padding-left:2em}p.dialog{padding:.2em}pre,code,kbd,samp{white-space:pre-wrap}#fonttest{font-family:monospace}p{margin-bottom:0}.end_space{min-height:100px;transition:height .2s ease}.notebook_app #header{-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2)}@media not print{.notebook_app{background-color:#eee}}.celltoolbar{border:thin solid #cfcfcf;border-bottom:none;background:#eee;border-radius:2px 2px 0 0;width:100%;height:29px;padding-right:4px;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch;-webkit-box-pack:end;-moz-box-pack:end;box-pack:end;justify-content:flex-end}@media print{.celltoolbar{display:none}}.ctb_hideshow{display:none;vertical-align:bottom}.ctb_global_show .ctb_show.ctb_hideshow{display:block}.ctb_global_show .ctb_show+.input_area,.ctb_global_show .ctb_show+div.text_cell_input,.ctb_global_show .ctb_show~div.text_cell_render{border-top-right-radius:0;border-top-left-radius:0}.ctb_global_show .ctb_show~div.text_cell_render{border:1px solid #cfcfcf}.celltoolbar{font-size:87%;padding-top:3px}.celltoolbar select{display:block;width:100%;height:32px;padding:6px 12px;font-size:13px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px;width:inherit;font-size:inherit;height:22px;padding:0;display:inline-block}.celltoolbar select:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.celltoolbar select::-moz-placeholder{color:#999;opacity:1}.celltoolbar select:-ms-input-placeholder{color:#999}.celltoolbar select::-webkit-input-placeholder{color:#999}.celltoolbar select[disabled],.celltoolbar select[readonly],fieldset[disabled] .celltoolbar select{cursor:not-allowed;background-color:#eee;opacity:1}textarea.celltoolbar select{height:auto}select.celltoolbar select{height:30px;line-height:30px}textarea.celltoolbar select,select[multiple].celltoolbar select{height:auto}.celltoolbar label{margin-left:5px;margin-right:5px}.completions{position:absolute;z-index:10;overflow:hidden;border:1px solid #ababab;border-radius:2px;-webkit-box-shadow:0 6px 10px -1px #adadad;box-shadow:0 6px 10px -1px #adadad}.completions select{background:white;outline:none;border:none;padding:0;margin:0;overflow:auto;font-family:monospace;font-size:110%;color:#000;width:auto}.completions select option.context{color:#286090}#kernel_logo_widget{float:right !important;float:right}#kernel_logo_widget .current_kernel_logo{display:none;margin-top:-1px;margin-bottom:-1px;width:32px;height:32px}#menubar{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;margin-top:1px}#menubar .navbar{border-top:1px;border-radius:0 0 2px 2px;margin-bottom:0}#menubar .navbar-toggle{float:left;padding-top:7px;padding-bottom:7px;border:none}#menubar .navbar-collapse{clear:left}.nav-wrapper{border-bottom:1px solid #e7e7e7}i.menu-icon{padding-top:4px}ul#help_menu li a{overflow:hidden;padding-right:2.2em}ul#help_menu li a i{margin-right:-1.2em}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);display:block;content:"\f0da";float:right;color:#333;margin-top:2px;margin-right:-10px}.dropdown-submenu>a:after.pull-left{margin-right:.3em}.dropdown-submenu>a:after.pull-right{margin-left:.3em}.dropdown-submenu:hover>a:after{color:#262626}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px}#notification_area{float:right !important;float:right;z-index:10}.indicator_area{float:right !important;float:right;color:#777;margin-left:5px;margin-right:5px;width:11px;z-index:10;text-align:center;width:auto}#kernel_indicator{float:right !important;float:right;color:#777;margin-left:5px;margin-right:5px;width:11px;z-index:10;text-align:center;width:auto;border-left:1px solid}#kernel_indicator .kernel_indicator_name{padding-left:5px;padding-right:5px}#modal_indicator{float:right !important;float:right;color:#777;margin-left:5px;margin-right:5px;width:11px;z-index:10;text-align:center;width:auto}#readonly-indicator{float:right !important;float:right;color:#777;margin-left:5px;margin-right:5px;width:11px;z-index:10;text-align:center;width:auto;margin-top:2px;margin-bottom:0;margin-left:0;margin-right:0;display:none}.modal_indicator:before{width:1.28571429em;text-align:center}.edit_mode .modal_indicator:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f040"}.edit_mode .modal_indicator:before.pull-left{margin-right:.3em}.edit_mode .modal_indicator:before.pull-right{margin-left:.3em}.command_mode .modal_indicator:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:' '}.command_mode .modal_indicator:before.pull-left{margin-right:.3em}.command_mode .modal_indicator:before.pull-right{margin-left:.3em}.kernel_idle_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f10c"}.kernel_idle_icon:before.pull-left{margin-right:.3em}.kernel_idle_icon:before.pull-right{margin-left:.3em}.kernel_busy_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f111"}.kernel_busy_icon:before.pull-left{margin-right:.3em}.kernel_busy_icon:before.pull-right{margin-left:.3em}.kernel_dead_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f1e2"}.kernel_dead_icon:before.pull-left{margin-right:.3em}.kernel_dead_icon:before.pull-right{margin-left:.3em}.kernel_disconnected_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"\f127"}.kernel_disconnected_icon:before.pull-left{margin-right:.3em}.kernel_disconnected_icon:before.pull-right{margin-left:.3em}.notification_widget{color:#777;z-index:10;background:rgba(240,240,240,0.5);color:#333;background-color:#fff;border-color:#ccc}.notification_widget:hover,.notification_widget:focus,.notification_widget.focus,.notification_widget:active,.notification_widget.active,.open>.dropdown-toggle.notification_widget{color:#333;background-color:#e6e6e6;border-color:#adadad}.notification_widget:active,.notification_widget.active,.open>.dropdown-toggle.notification_widget{background-image:none}.notification_widget.disabled,.notification_widget[disabled],fieldset[disabled] .notification_widget,.notification_widget.disabled:hover,.notification_widget[disabled]:hover,fieldset[disabled] .notification_widget:hover,.notification_widget.disabled:focus,.notification_widget[disabled]:focus,fieldset[disabled] .notification_widget:focus,.notification_widget.disabled.focus,.notification_widget[disabled].focus,fieldset[disabled] .notification_widget.focus,.notification_widget.disabled:active,.notification_widget[disabled]:active,fieldset[disabled] .notification_widget:active,.notification_widget.disabled.active,.notification_widget[disabled].active,fieldset[disabled] .notification_widget.active{background-color:#fff;border-color:#ccc}.notification_widget .badge{color:#fff;background-color:#333}.notification_widget.warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.notification_widget.warning:hover,.notification_widget.warning:focus,.notification_widget.warning.focus,.notification_widget.warning:active,.notification_widget.warning.active,.open>.dropdown-toggle.notification_widget.warning{color:#fff;background-color:#ec971f;border-color:#d58512}.notification_widget.warning:active,.notification_widget.warning.active,.open>.dropdown-toggle.notification_widget.warning{background-image:none}.notification_widget.warning.disabled,.notification_widget.warning[disabled],fieldset[disabled] .notification_widget.warning,.notification_widget.warning.disabled:hover,.notification_widget.warning[disabled]:hover,fieldset[disabled] .notification_widget.warning:hover,.notification_widget.warning.disabled:focus,.notification_widget.warning[disabled]:focus,fieldset[disabled] .notification_widget.warning:focus,.notification_widget.warning.disabled.focus,.notification_widget.warning[disabled].focus,fieldset[disabled] .notification_widget.warning.focus,.notification_widget.warning.disabled:active,.notification_widget.warning[disabled]:active,fieldset[disabled] .notification_widget.warning:active,.notification_widget.warning.disabled.active,.notification_widget.warning[disabled].active,fieldset[disabled] .notification_widget.warning.active{background-color:#f0ad4e;border-color:#eea236}.notification_widget.warning .badge{color:#f0ad4e;background-color:#fff}.notification_widget.success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.notification_widget.success:hover,.notification_widget.success:focus,.notification_widget.success.focus,.notification_widget.success:active,.notification_widget.success.active,.open>.dropdown-toggle.notification_widget.success{color:#fff;background-color:#449d44;border-color:#398439}.notification_widget.success:active,.notification_widget.success.active,.open>.dropdown-toggle.notification_widget.success{background-image:none}.notification_widget.success.disabled,.notification_widget.success[disabled],fieldset[disabled] .notification_widget.success,.notification_widget.success.disabled:hover,.notification_widget.success[disabled]:hover,fieldset[disabled] .notification_widget.success:hover,.notification_widget.success.disabled:focus,.notification_widget.success[disabled]:focus,fieldset[disabled] .notification_widget.success:focus,.notification_widget.success.disabled.focus,.notification_widget.success[disabled].focus,fieldset[disabled] .notification_widget.success.focus,.notification_widget.success.disabled:active,.notification_widget.success[disabled]:active,fieldset[disabled] .notification_widget.success:active,.notification_widget.success.disabled.active,.notification_widget.success[disabled].active,fieldset[disabled] .notification_widget.success.active{background-color:#5cb85c;border-color:#4cae4c}.notification_widget.success .badge{color:#5cb85c;background-color:#fff}.notification_widget.info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.notification_widget.info:hover,.notification_widget.info:focus,.notification_widget.info.focus,.notification_widget.info:active,.notification_widget.info.active,.open>.dropdown-toggle.notification_widget.info{color:#fff;background-color:#31b0d5;border-color:#269abc}.notification_widget.info:active,.notification_widget.info.active,.open>.dropdown-toggle.notification_widget.info{background-image:none}.notification_widget.info.disabled,.notification_widget.info[disabled],fieldset[disabled] .notification_widget.info,.notification_widget.info.disabled:hover,.notification_widget.info[disabled]:hover,fieldset[disabled] .notification_widget.info:hover,.notification_widget.info.disabled:focus,.notification_widget.info[disabled]:focus,fieldset[disabled] .notification_widget.info:focus,.notification_widget.info.disabled.focus,.notification_widget.info[disabled].focus,fieldset[disabled] .notification_widget.info.focus,.notification_widget.info.disabled:active,.notification_widget.info[disabled]:active,fieldset[disabled] .notification_widget.info:active,.notification_widget.info.disabled.active,.notification_widget.info[disabled].active,fieldset[disabled] .notification_widget.info.active{background-color:#5bc0de;border-color:#46b8da}.notification_widget.info .badge{color:#5bc0de;background-color:#fff}.notification_widget.danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.notification_widget.danger:hover,.notification_widget.danger:focus,.notification_widget.danger.focus,.notification_widget.danger:active,.notification_widget.danger.active,.open>.dropdown-toggle.notification_widget.danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.notification_widget.danger:active,.notification_widget.danger.active,.open>.dropdown-toggle.notification_widget.danger{background-image:none}.notification_widget.danger.disabled,.notification_widget.danger[disabled],fieldset[disabled] .notification_widget.danger,.notification_widget.danger.disabled:hover,.notification_widget.danger[disabled]:hover,fieldset[disabled] .notification_widget.danger:hover,.notification_widget.danger.disabled:focus,.notification_widget.danger[disabled]:focus,fieldset[disabled] .notification_widget.danger:focus,.notification_widget.danger.disabled.focus,.notification_widget.danger[disabled].focus,fieldset[disabled] .notification_widget.danger.focus,.notification_widget.danger.disabled:active,.notification_widget.danger[disabled]:active,fieldset[disabled] .notification_widget.danger:active,.notification_widget.danger.disabled.active,.notification_widget.danger[disabled].active,fieldset[disabled] .notification_widget.danger.active{background-color:#d9534f;border-color:#d43f3a}.notification_widget.danger .badge{color:#d9534f;background-color:#fff}div#pager{background-color:#fff;font-size:14px;line-height:20px;overflow:hidden;display:none;position:fixed;bottom:0;width:100%;max-height:50%;padding-top:8px;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2);z-index:100;top:auto !important}div#pager pre{line-height:1.21429em;color:#000;background-color:#f7f7f7;padding:.4em}div#pager #pager-button-area{position:absolute;top:8px;right:20px}div#pager #pager-contents{position:relative;overflow:auto;width:100%;height:100%}div#pager #pager-contents #pager-container{position:relative;padding:15px 0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}div#pager .ui-resizable-handle{top:0;height:8px;background:#f7f7f7;border-top:1px solid #cfcfcf;border-bottom:1px solid #cfcfcf}div#pager .ui-resizable-handle::after{content:'';top:2px;left:50%;height:3px;width:30px;margin-left:-15px;position:absolute;border-top:1px solid #cfcfcf}.quickhelp{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.shortcut_key{display:inline-block;width:20ex;text-align:right;font-family:monospace}.shortcut_descr{display:inline-block;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}span.save_widget{margin-top:6px}span.save_widget span.filename{height:1em;line-height:1em;padding:3px;margin-left:16px;border:none;font-size:146.5%;border-radius:2px}span.save_widget span.filename:hover{background-color:#e6e6e6}span.checkpoint_status,span.autosave_status{font-size:small}@media (max-width:767px){span.save_widget{font-size:small}span.checkpoint_status,span.autosave_status{display:none}}@media (min-width:768px) and (max-width:991px){span.checkpoint_status{display:none}span.autosave_status{font-size:x-small}}.toolbar{padding:0;margin-left:-5px;margin-top:2px;margin-bottom:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.toolbar select,.toolbar label{width:auto;vertical-align:middle;margin-right:2px;margin-bottom:0;display:inline;font-size:92%;margin-left:.3em;margin-right:.3em;padding:0;padding-top:3px}.toolbar .btn{padding:2px 8px}.toolbar .btn-group{margin-top:0;margin-left:5px}#maintoolbar{margin-bottom:-3px;margin-top:-8px;border:0;min-height:27px;margin-left:0;padding-top:11px;padding-bottom:3px}#maintoolbar .navbar-text{float:none;vertical-align:middle;text-align:right;margin-left:5px;margin-right:0;margin-top:0}.select-xs{height:24px}@-moz-keyframes fadeOut{from{opacity:1}to{opacity:0}}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@-moz-keyframes fadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}.bigtooltip{overflow:auto;height:200px;-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms}.smalltooltip{-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms;text-overflow:ellipsis;overflow:hidden;height:80px}.tooltipbuttons{position:absolute;padding-right:15px;top:0;right:0}.tooltiptext{padding-right:30px}.ipython_tooltip{max-width:700px;-webkit-animation:fadeOut 400ms;-moz-animation:fadeOut 400ms;animation:fadeOut 400ms;-webkit-animation:fadeIn 400ms;-moz-animation:fadeIn 400ms;animation:fadeIn 400ms;vertical-align:middle;background-color:#f7f7f7;overflow:visible;border:#ababab 1px solid;outline:none;padding:3px;margin:0;padding-left:7px;font-family:monospace;min-height:50px;-moz-box-shadow:0 6px 10px -1px #adadad;-webkit-box-shadow:0 6px 10px -1px #adadad;box-shadow:0 6px 10px -1px #adadad;border-radius:2px;position:absolute;z-index:1000}.ipython_tooltip a{float:right}.ipython_tooltip .tooltiptext pre{border:0;border-radius:0;font-size:100%;background-color:#f7f7f7}.pretooltiparrow{left:0;margin:0;top:-16px;width:40px;height:16px;overflow:hidden;position:absolute}.pretooltiparrow:before{background-color:#f7f7f7;border:1px #ababab solid;z-index:11;content:"";position:absolute;left:15px;top:10px;width:25px;height:25px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg)}.terminal-app{background:#eee}.terminal-app #header{background:#fff;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.2);box-shadow:0 0 12px 1px rgba(87,87,87,0.2)}.terminal-app .terminal{float:left;font-family:monospace;color:white;background:black;padding:.4em;border-radius:2px;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,0.4);box-shadow:0 0 12px 1px rgba(87,87,87,0.4)}.terminal-app .terminal,.terminal-app .terminal dummy-screen{line-height:1em;font-size:14px}.terminal-app .terminal-cursor{color:black;background:white}.terminal-app #terminado-container{margin-top:20px}/*# sourceMappingURL=style.min.css.map */</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/textcell.js b/ipynb/Array-feature-overlap-05_files/textcell.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..8046c41</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/textcell.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'notebook/js/cell',</span>&nbsp; <span class='diff-add'> 'base/js/security',</span>&nbsp; <span class='diff-add'> 'services/config',</span>&nbsp; <span class='diff-add'> 'notebook/js/mathjaxutils',</span>&nbsp; <span class='diff-add'> 'notebook/js/celltoolbar',</span>&nbsp; <span class='diff-add'> 'components/marked/lib/marked',</span>&nbsp; <span class='diff-add'> 'codemirror/lib/codemirror',</span>&nbsp; <span class='diff-add'> 'codemirror/mode/gfm/gfm',</span>&nbsp; <span class='diff-add'> 'notebook/js/codemirror-ipythongfm'</span>&nbsp; <span class='diff-add'>], function(IPython,</span>&nbsp; <span class='diff-add'> utils,</span>&nbsp; <span class='diff-add'> $,</span>&nbsp; <span class='diff-add'> cell,</span>&nbsp; <span class='diff-add'> security,</span>&nbsp; <span class='diff-add'> configmod,</span>&nbsp; <span class='diff-add'> mathjaxutils,</span>&nbsp; <span class='diff-add'> celltoolbar,</span>&nbsp; <span class='diff-add'> marked,</span>&nbsp; <span class='diff-add'> CodeMirror,</span>&nbsp; <span class='diff-add'> gfm,</span>&nbsp; <span class='diff-add'> ipgfm</span>&nbsp; <span class='diff-add'> ) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var Cell = cell.Cell;</span>&nbsp; <span class='diff-add'> var TextCell = function (options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Construct a new TextCell, codemirror mode is by default 'htmlmixed', </span>&nbsp; <span class='diff-add'> * and cell type is 'text' cell start as not redered.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters:</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> * events: $(Events) instance </span>&nbsp; <span class='diff-add'> * config: dictionary</span>&nbsp; <span class='diff-add'> * keyboard_manager: KeyboardManager instance </span>&nbsp; <span class='diff-add'> * notebook: Notebook instance</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> // in all TextCell/Cell subclasses</span>&nbsp; <span class='diff-add'> // do not assign most of members here, just pass it down</span>&nbsp; <span class='diff-add'> // in the options dict potentially overwriting what you wish.</span>&nbsp; <span class='diff-add'> // they will be assigned in the base class.</span>&nbsp; <span class='diff-add'> this.notebook = options.notebook;</span>&nbsp; <span class='diff-add'> this.events = options.events;</span>&nbsp; <span class='diff-add'> this.config = options.config;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // we cannot put this as a class key as it has handle to "this".</span>&nbsp; <span class='diff-add'> var config = utils.mergeopt(TextCell, this.config);</span>&nbsp; <span class='diff-add'> Cell.apply(this, [{</span>&nbsp; <span class='diff-add'> config: config, </span>&nbsp; <span class='diff-add'> keyboard_manager: options.keyboard_manager, </span>&nbsp; <span class='diff-add'> events: this.events}]);</span>&nbsp; <span class='diff-add'> this.cell_type = this.cell_type || 'text';</span>&nbsp; <span class='diff-add'> mathjaxutils = mathjaxutils;</span>&nbsp; <span class='diff-add'> this.rendered = false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> TextCell.prototype = Object.create(Cell.prototype);</span>&nbsp; <span class='diff-add'> TextCell.options_default = {</span>&nbsp; <span class='diff-add'> cm_config : {</span>&nbsp; <span class='diff-add'> extraKeys: {"Tab": "indentMore","Shift-Tab" : "indentLess"},</span>&nbsp; <span class='diff-add'> mode: 'htmlmixed',</span>&nbsp; <span class='diff-add'> lineWrapping : true,</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Create the DOM element of the TextCell</span>&nbsp; <span class='diff-add'> * @method create_element</span>&nbsp; <span class='diff-add'> * @private</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> TextCell.prototype.create_element = function () {</span>&nbsp; <span class='diff-add'> Cell.prototype.create_element.apply(this, arguments);</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var cell = $("<div>").addClass('cell text_cell');</span>&nbsp; <span class='diff-add'> cell.attr('tabindex','2');</span>&nbsp; <span class='diff-add'> var prompt = $('<div/>').addClass('prompt input_prompt');</span>&nbsp; <span class='diff-add'> cell.append(prompt);</span>&nbsp; <span class='diff-add'> var inner_cell = $('<div/>').addClass('inner_cell');</span>&nbsp; <span class='diff-add'> this.celltoolbar = new celltoolbar.CellToolbar({</span>&nbsp; <span class='diff-add'> cell: this, </span>&nbsp; <span class='diff-add'> notebook: this.notebook});</span>&nbsp; <span class='diff-add'> inner_cell.append(this.celltoolbar.element);</span>&nbsp; <span class='diff-add'> var input_area = $('<div/>').addClass('input_area');</span>&nbsp; <span class='diff-add'> this.code_mirror = new CodeMirror(input_area.get(0), this.cm_config);</span>&nbsp; <span class='diff-add'> // In case of bugs that put the keyboard manager into an inconsistent state,</span>&nbsp; <span class='diff-add'> // ensure KM is enabled when CodeMirror is focused:</span>&nbsp; <span class='diff-add'> this.code_mirror.on('focus', function () {</span>&nbsp; <span class='diff-add'> if (that.keyboard_manager) {</span>&nbsp; <span class='diff-add'> that.keyboard_manager.enable();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.code_mirror.on('keydown', $.proxy(this.handle_keyevent,this))</span>&nbsp; <span class='diff-add'> // The tabindex=-1 makes this div focusable.</span>&nbsp; <span class='diff-add'> var render_area = $('<div/>').addClass('text_cell_render rendered_html')</span>&nbsp; <span class='diff-add'> .attr('tabindex','-1');</span>&nbsp; <span class='diff-add'> inner_cell.append(input_area).append(render_area);</span>&nbsp; <span class='diff-add'> cell.append(inner_cell);</span>&nbsp; <span class='diff-add'> this.element = cell;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Cell level actions</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> TextCell.prototype.select = function () {</span>&nbsp; <span class='diff-add'> var cont = Cell.prototype.select.apply(this);</span>&nbsp; <span class='diff-add'> if (cont) {</span>&nbsp; <span class='diff-add'> if (this.mode === 'edit') {</span>&nbsp; <span class='diff-add'> this.code_mirror.refresh();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cont;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> TextCell.prototype.unrender = function () {</span>&nbsp; <span class='diff-add'> if (this.read_only) return;</span>&nbsp; <span class='diff-add'> var cont = Cell.prototype.unrender.apply(this);</span>&nbsp; <span class='diff-add'> if (cont) {</span>&nbsp; <span class='diff-add'> var text_cell = this.element;</span>&nbsp; <span class='diff-add'> if (this.get_text() === this.placeholder) {</span>&nbsp; <span class='diff-add'> this.set_text('');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.refresh();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cont;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> TextCell.prototype.execute = function () {</span>&nbsp; <span class='diff-add'> this.render();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * setter: {{#crossLink "TextCell/set_text"}}{{/crossLink}}</span>&nbsp; <span class='diff-add'> * @method get_text</span>&nbsp; <span class='diff-add'> * @retrun {string} CodeMirror current text value</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> TextCell.prototype.get_text = function() {</span>&nbsp; <span class='diff-add'> return this.code_mirror.getValue();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @param {string} text - Codemiror text value</span>&nbsp; <span class='diff-add'> * @see TextCell#get_text</span>&nbsp; <span class='diff-add'> * @method set_text</span>&nbsp; <span class='diff-add'> * */</span>&nbsp; <span class='diff-add'> TextCell.prototype.set_text = function(text) {</span>&nbsp; <span class='diff-add'> this.code_mirror.setValue(text);</span>&nbsp; <span class='diff-add'> this.unrender();</span>&nbsp; <span class='diff-add'> this.code_mirror.refresh();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * setter :{{#crossLink "TextCell/set_rendered"}}{{/crossLink}}</span>&nbsp; <span class='diff-add'> * @method get_rendered</span>&nbsp; <span class='diff-add'> * */</span>&nbsp; <span class='diff-add'> TextCell.prototype.get_rendered = function() {</span>&nbsp; <span class='diff-add'> return this.element.find('div.text_cell_render').html();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @method set_rendered</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> TextCell.prototype.set_rendered = function(text) {</span>&nbsp; <span class='diff-add'> this.element.find('div.text_cell_render').html(text);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Create Text cell from JSON</span>&nbsp; <span class='diff-add'> * @param {json} data - JSON serialized text-cell</span>&nbsp; <span class='diff-add'> * @method fromJSON</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> TextCell.prototype.fromJSON = function (data) {</span>&nbsp; <span class='diff-add'> Cell.prototype.fromJSON.apply(this, arguments);</span>&nbsp; <span class='diff-add'> if (data.cell_type === this.cell_type) {</span>&nbsp; <span class='diff-add'> if (data.source !== undefined) {</span>&nbsp; <span class='diff-add'> this.set_text(data.source);</span>&nbsp; <span class='diff-add'> // make this value the starting point, so that we can only undo</span>&nbsp; <span class='diff-add'> // to this state, instead of a blank cell</span>&nbsp; <span class='diff-add'> this.code_mirror.clearHistory();</span>&nbsp; <span class='diff-add'> // TODO: This HTML needs to be treated as potentially dangerous</span>&nbsp; <span class='diff-add'> // user input and should be handled before set_rendered. </span>&nbsp; <span class='diff-add'> this.set_rendered(data.rendered || '');</span>&nbsp; <span class='diff-add'> this.rendered = false;</span>&nbsp; <span class='diff-add'> this.render();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** Generate JSON from cell</span>&nbsp; <span class='diff-add'> * @return {object} cell data serialised to json</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> TextCell.prototype.toJSON = function () {</span>&nbsp; <span class='diff-add'> var data = Cell.prototype.toJSON.apply(this);</span>&nbsp; <span class='diff-add'> data.source = this.get_text();</span>&nbsp; <span class='diff-add'> if (data.source == this.placeholder) {</span>&nbsp; <span class='diff-add'> data.source = "";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return data;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var MarkdownCell = function (options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters:</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> * events: $(Events) instance </span>&nbsp; <span class='diff-add'> * config: ConfigSection instance</span>&nbsp; <span class='diff-add'> * keyboard_manager: KeyboardManager instance </span>&nbsp; <span class='diff-add'> * notebook: Notebook instance</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> var config = utils.mergeopt(MarkdownCell, {});</span>&nbsp; <span class='diff-add'> TextCell.apply(this, [$.extend({}, options, {config: config})]);</span>&nbsp; <span class='diff-add'> this.class_config = new configmod.ConfigWithDefaults(options.config,</span>&nbsp; <span class='diff-add'> {}, 'MarkdownCell');</span>&nbsp; <span class='diff-add'> this.cell_type = 'markdown';</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> MarkdownCell.options_default = {</span>&nbsp; <span class='diff-add'> cm_config: {</span>&nbsp; <span class='diff-add'> mode: 'ipythongfm'</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> placeholder: "Type *Markdown* and LaTeX: $\\alpha^2$"</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> MarkdownCell.prototype = Object.create(TextCell.prototype);</span>&nbsp; <span class='diff-add'> MarkdownCell.prototype.set_heading_level = function (level) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * make a markdown cell a heading</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> level = level || 1;</span>&nbsp; <span class='diff-add'> var source = this.get_text();</span>&nbsp; <span class='diff-add'> source = source.replace(/^(#*)\s?/,</span>&nbsp; <span class='diff-add'> new Array(level + 1).join('#') + ' ');</span>&nbsp; <span class='diff-add'> this.set_text(source);</span>&nbsp; <span class='diff-add'> this.refresh();</span>&nbsp; <span class='diff-add'> if (this.rendered) {</span>&nbsp; <span class='diff-add'> this.render();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * @method render</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> MarkdownCell.prototype.render = function () {</span>&nbsp; <span class='diff-add'> var cont = TextCell.prototype.render.apply(this);</span>&nbsp; <span class='diff-add'> if (cont) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var text = this.get_text();</span>&nbsp; <span class='diff-add'> var math = null;</span>&nbsp; <span class='diff-add'> if (text === "") { text = this.placeholder; }</span>&nbsp; <span class='diff-add'> var text_and_math = mathjaxutils.remove_math(text);</span>&nbsp; <span class='diff-add'> text = text_and_math[0];</span>&nbsp; <span class='diff-add'> math = text_and_math[1];</span>&nbsp; <span class='diff-add'> marked(text, function (err, html) {</span>&nbsp; <span class='diff-add'> html = mathjaxutils.replace_math(html, math);</span>&nbsp; <span class='diff-add'> html = security.sanitize_html(html);</span>&nbsp; <span class='diff-add'> html = $($.parseHTML(html));</span>&nbsp; <span class='diff-add'> // add anchors to headings</span>&nbsp; <span class='diff-add'> html.find(":header").addBack(":header").each(function (i, h) {</span>&nbsp; <span class='diff-add'> h = $(h);</span>&nbsp; <span class='diff-add'> var hash = h.text().replace(/ /g, '-');</span>&nbsp; <span class='diff-add'> h.attr('id', hash);</span>&nbsp; <span class='diff-add'> h.append(</span>&nbsp; <span class='diff-add'> $('<a/>')</span>&nbsp; <span class='diff-add'> .addClass('anchor-link')</span>&nbsp; <span class='diff-add'> .attr('href', '#' + hash)</span>&nbsp; <span class='diff-add'> .text('¶')</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // links in markdown cells should open in new tabs</span>&nbsp; <span class='diff-add'> html.find("a[href]").not('[href^="#"]').attr("target", "_blank");</span>&nbsp; <span class='diff-add'> that.set_rendered(html);</span>&nbsp; <span class='diff-add'> that.typeset();</span>&nbsp; <span class='diff-add'> that.events.trigger("rendered.MarkdownCell", {cell: that});</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cont;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var RawCell = function (options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters:</span>&nbsp; <span class='diff-add'> * options: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of keyword arguments.</span>&nbsp; <span class='diff-add'> * events: $(Events) instance </span>&nbsp; <span class='diff-add'> * config: ConfigSection instance</span>&nbsp; <span class='diff-add'> * keyboard_manager: KeyboardManager instance </span>&nbsp; <span class='diff-add'> * notebook: Notebook instance</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> var config = utils.mergeopt(RawCell, {});</span>&nbsp; <span class='diff-add'> TextCell.apply(this, [$.extend({}, options, {config: config})]);</span>&nbsp; <span class='diff-add'> this.class_config = new configmod.ConfigWithDefaults(options.config,</span>&nbsp; <span class='diff-add'> RawCell.config_defaults, 'RawCell');</span>&nbsp; <span class='diff-add'> this.cell_type = 'raw';</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> RawCell.options_default = {</span>&nbsp; <span class='diff-add'> placeholder : "Write raw LaTeX or other formats here, for use with nbconvert. " +</span>&nbsp; <span class='diff-add'> "It will not be rendered in the notebook. " + </span>&nbsp; <span class='diff-add'> "When passing through nbconvert, a Raw Cell's content is added to the output unmodified."</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> RawCell.config_defaults = {</span>&nbsp; <span class='diff-add'> highlight_modes : {</span>&nbsp; <span class='diff-add'> 'diff' :{'reg':[/^diff/]}</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> RawCell.prototype = Object.create(TextCell.prototype);</span>&nbsp; <span class='diff-add'> /** @method bind_events **/</span>&nbsp; <span class='diff-add'> RawCell.prototype.bind_events = function () {</span>&nbsp; <span class='diff-add'> TextCell.prototype.bind_events.apply(this);</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.element.focusout(function() {</span>&nbsp; <span class='diff-add'> that.auto_highlight();</span>&nbsp; <span class='diff-add'> that.render();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.code_mirror.on('focus', function() { that.unrender(); });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /** @method render **/</span>&nbsp; <span class='diff-add'> RawCell.prototype.render = function () {</span>&nbsp; <span class='diff-add'> var cont = TextCell.prototype.render.apply(this);</span>&nbsp; <span class='diff-add'> if (cont){</span>&nbsp; <span class='diff-add'> var text = this.get_text();</span>&nbsp; <span class='diff-add'> if (text === "") { text = this.placeholder; }</span>&nbsp; <span class='diff-add'> this.set_text(text);</span>&nbsp; <span class='diff-add'> this.element.removeClass('rendered');</span>&nbsp; <span class='diff-add'> this.auto_highlight();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cont;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.TextCell = TextCell;</span>&nbsp; <span class='diff-add'> IPython.MarkdownCell = MarkdownCell;</span>&nbsp; <span class='diff-add'> IPython.RawCell = RawCell;</span>&nbsp; <span class='diff-add'> var textcell = {</span>&nbsp; <span class='diff-add'> TextCell: TextCell,</span>&nbsp; <span class='diff-add'> MarkdownCell: MarkdownCell,</span>&nbsp; <span class='diff-add'> RawCell: RawCell</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return textcell;</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/toolbar.js b/ipynb/Array-feature-overlap-05_files/toolbar.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..a008a0d</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/toolbar.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery'</span>&nbsp; <span class='diff-add'>], function(IPython, $) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * A generic toolbar on which one can add button</span>&nbsp; <span class='diff-add'> * @class ToolBar</span>&nbsp; <span class='diff-add'> * @constructor</span>&nbsp; <span class='diff-add'> * @param {Dom_object} selector</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var ToolBar = function (selector, options) {</span>&nbsp; <span class='diff-add'> this.selector = selector;</span>&nbsp; <span class='diff-add'> this.actions = (options||{}).actions;</span>&nbsp; <span class='diff-add'> if (this.selector !== undefined) {</span>&nbsp; <span class='diff-add'> this.element = $(selector);</span>&nbsp; <span class='diff-add'> this.style();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ToolBar.prototype._pseudo_actions={};</span>&nbsp; <span class='diff-add'> ToolBar.prototype.construct = function (config) {</span>&nbsp; <span class='diff-add'> for(var k=0; k<config.length; k++) {</span>&nbsp; <span class='diff-add'> this.add_buttons_group(config[k][0],config[k][1]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Add a group of button into the current toolbar.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Use a [dict of [list of action name]] to trigger</span>&nbsp; <span class='diff-add'> * on click to the button</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @example</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * ... todo, maybe use a list of list to keep ordering.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * [</span>&nbsp; <span class='diff-add'> * [</span>&nbsp; <span class='diff-add'> * [</span>&nbsp; <span class='diff-add'> * action_name_1,</span>&nbsp; <span class='diff-add'> * action_name_2,</span>&nbsp; <span class='diff-add'> * action_name_3,</span>&nbsp; <span class='diff-add'> * ],</span>&nbsp; <span class='diff-add'> * optional_group_name</span>&nbsp; <span class='diff-add'> * ],</span>&nbsp; <span class='diff-add'> * ...</span>&nbsp; <span class='diff-add'> * ]</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * For backward compatibility this also support the</span>&nbsp; <span class='diff-add'> * old methods of adding a button directly bound to callbacks:</span>&nbsp; <span class='diff-add'> * @example</span>&nbsp; <span class='diff-add'> * # deprecate, do not use</span>&nbsp; <span class='diff-add'> * IPython.toolbar.add_buttons_group([</span>&nbsp; <span class='diff-add'> * {</span>&nbsp; <span class='diff-add'> * label:'my button',</span>&nbsp; <span class='diff-add'> * icon:'icon-hdd',</span>&nbsp; <span class='diff-add'> * callback:function(){alert('hoho')},</span>&nbsp; <span class='diff-add'> * id : 'my_button_id', // this is optional</span>&nbsp; <span class='diff-add'> * },</span>&nbsp; <span class='diff-add'> * {</span>&nbsp; <span class='diff-add'> * label:'my second button',</span>&nbsp; <span class='diff-add'> * icon:'icon-play',</span>&nbsp; <span class='diff-add'> * callback:function(){alert('be carefull I cut')}</span>&nbsp; <span class='diff-add'> * }</span>&nbsp; <span class='diff-add'> * ],</span>&nbsp; <span class='diff-add'> * "my_button_group_id"</span>&nbsp; <span class='diff-add'> * )</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * @method add_buttons_group</span>&nbsp; <span class='diff-add'> * @param list {List}</span>&nbsp; <span class='diff-add'> * List of button of the group, with the following paramter for each :</span>&nbsp; <span class='diff-add'> * @param list.label {string} text to show on button hover</span>&nbsp; <span class='diff-add'> * @param list.icon {string} icon to choose from [Font Awesome](http://fortawesome.github.io/Font-Awesome)</span>&nbsp; <span class='diff-add'> * @param list.callback {function} function to be called on button click</span>&nbsp; <span class='diff-add'> * @param [list.id] {String} id to give to the button</span>&nbsp; <span class='diff-add'> * @param [group_id] {String} optionnal id to give to the group</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * for private usage, the key can also be strings starting with '<' and ending with '>' to inject custom element that cannot</span>&nbsp; <span class='diff-add'> * be bound to an action.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> // TODO JUPYTER:</span>&nbsp; <span class='diff-add'> // get rid of legacy code that handle things that are not actions.</span>&nbsp; <span class='diff-add'> ToolBar.prototype.add_buttons_group = function (list, group_id) {</span>&nbsp; <span class='diff-add'> // handle custom call of pseudoaction binding.</span>&nbsp; <span class='diff-add'> if(typeof(list) === 'string' && list.slice(0,1) === '<' && list.slice(-1) === '>'){</span>&nbsp; <span class='diff-add'> var _pseudo_action;</span>&nbsp; <span class='diff-add'> try{</span>&nbsp; <span class='diff-add'> _pseudo_action = list.slice(1,-1);</span>&nbsp; <span class='diff-add'> this.element.append(this._pseudo_actions[_pseudo_action].call(this));</span>&nbsp; <span class='diff-add'> } catch (e) {</span>&nbsp; <span class='diff-add'> console.warn('ouch, calling ', _pseudo_action, 'does not seem to work...:', e);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return ;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var btn_group = $('<div/>').addClass("btn-group");</span>&nbsp; <span class='diff-add'> if( group_id !== undefined ) {</span>&nbsp; <span class='diff-add'> btn_group.attr('id',group_id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> for(var i=0; i < list.length; i++) {</span>&nbsp; <span class='diff-add'> // IIFE because javascript don't have loop scope so</span>&nbsp; <span class='diff-add'> // action_name would otherwise be the same on all iteration</span>&nbsp; <span class='diff-add'> // of the loop</span>&nbsp; <span class='diff-add'> (function(i,list){</span>&nbsp; <span class='diff-add'> var el = list[i];</span>&nbsp; <span class='diff-add'> var action_name;</span>&nbsp; <span class='diff-add'> var action;</span>&nbsp; <span class='diff-add'> if(typeof(el) === 'string'){</span>&nbsp; <span class='diff-add'> action = that.actions.get(el);</span>&nbsp; <span class='diff-add'> action_name = el;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var button = $('<button/>')</span>&nbsp; <span class='diff-add'> .addClass('btn btn-default')</span>&nbsp; <span class='diff-add'> .attr("title", el.label||action.help)</span>&nbsp; <span class='diff-add'> .append(</span>&nbsp; <span class='diff-add'> $("<i/>").addClass(el.icon||action.icon).addClass('fa')</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> var id = el.id;</span>&nbsp; <span class='diff-add'> if( id !== undefined ){</span>&nbsp; <span class='diff-add'> button.attr('id',id);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> button.attr('data-jupyter-action', action_name);</span>&nbsp; <span class='diff-add'> var fun = el.callback|| function(){</span>&nbsp; <span class='diff-add'> that.actions.call(action_name);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> button.click(fun);</span>&nbsp; <span class='diff-add'> btn_group.append(button);</span>&nbsp; <span class='diff-add'> })(i,list);</span>&nbsp; <span class='diff-add'> // END IIFE</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> $(this.selector).append(btn_group);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> ToolBar.prototype.style = function () {</span>&nbsp; <span class='diff-add'> this.element.addClass('toolbar');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Show and hide toolbar</span>&nbsp; <span class='diff-add'> * @method toggle</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> ToolBar.prototype.toggle = function () {</span>&nbsp; <span class='diff-add'> this.element.toggle();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatibility.</span>&nbsp; <span class='diff-add'> IPython.ToolBar = ToolBar;</span>&nbsp; <span class='diff-add'> return {'ToolBar': ToolBar};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/tooltip.js b/ipynb/Array-feature-overlap-05_files/tooltip.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..d8c61eb</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/tooltip.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'base/js/utils',</span>&nbsp; <span class='diff-add'>], function(IPython, $, utils) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> // tooltip constructor</span>&nbsp; <span class='diff-add'> var Tooltip = function (events) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.events = events;</span>&nbsp; <span class='diff-add'> this.time_before_tooltip = 1200;</span>&nbsp; <span class='diff-add'> // handle to html</span>&nbsp; <span class='diff-add'> this.tooltip = $('#tooltip');</span>&nbsp; <span class='diff-add'> this._hidden = true;</span>&nbsp; <span class='diff-add'> // variable for consecutive call</span>&nbsp; <span class='diff-add'> this._old_cell = null;</span>&nbsp; <span class='diff-add'> this._old_request = null;</span>&nbsp; <span class='diff-add'> this._consecutive_counter = 0;</span>&nbsp; <span class='diff-add'> // 'sticky ?'</span>&nbsp; <span class='diff-add'> this._sticky = false;</span>&nbsp; <span class='diff-add'> // display tooltip if the docstring is empty?</span>&nbsp; <span class='diff-add'> this._hide_if_no_docstring = false;</span>&nbsp; <span class='diff-add'> // contain the button in the upper right corner</span>&nbsp; <span class='diff-add'> this.buttons = $('<div/>').addClass('tooltipbuttons');</span>&nbsp; <span class='diff-add'> // will contain the docstring</span>&nbsp; <span class='diff-add'> this.text = $('<div/>').addClass('tooltiptext').addClass('smalltooltip');</span>&nbsp; <span class='diff-add'> // build the buttons menu on the upper right</span>&nbsp; <span class='diff-add'> // expand the tooltip to see more</span>&nbsp; <span class='diff-add'> var expandlink = $('<a/>').attr('href', "#").addClass("ui-corner-all") //rounded corner</span>&nbsp; <span class='diff-add'> .attr('role', "button").attr('id', 'expanbutton').attr('title', 'Grow the tooltip vertically (press shift-tab twice)').click(function () {</span>&nbsp; <span class='diff-add'> that.expand();</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> }).append(</span>&nbsp; <span class='diff-add'> $('<span/>').text('Expand').addClass('ui-icon').addClass('ui-icon-plus'));</span>&nbsp; <span class='diff-add'> // open in pager</span>&nbsp; <span class='diff-add'> var morelink = $('<a/>').attr('href', "#").attr('role', "button").addClass('ui-button').attr('title', 'show the current docstring in pager (press shift-tab 4 times)');</span>&nbsp; <span class='diff-add'> var morespan = $('<span/>').text('Open in Pager').addClass('ui-icon').addClass('ui-icon-arrowstop-l-n');</span>&nbsp; <span class='diff-add'> morelink.append(morespan);</span>&nbsp; <span class='diff-add'> morelink.click(function () {</span>&nbsp; <span class='diff-add'> that.showInPager(that._old_cell);</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // close the tooltip</span>&nbsp; <span class='diff-add'> var closelink = $('<a/>').attr('href', "#").attr('role', "button").addClass('ui-button');</span>&nbsp; <span class='diff-add'> var closespan = $('<span/>').text('Close').addClass('ui-icon').addClass('ui-icon-close');</span>&nbsp; <span class='diff-add'> closelink.append(closespan);</span>&nbsp; <span class='diff-add'> closelink.click(function () {</span>&nbsp; <span class='diff-add'> that.remove_and_cancel_tooltip(true);</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this._clocklink = $('<a/>').attr('href', "#");</span>&nbsp; <span class='diff-add'> this._clocklink.attr('role', "button");</span>&nbsp; <span class='diff-add'> this._clocklink.addClass('ui-button');</span>&nbsp; <span class='diff-add'> this._clocklink.attr('title', 'Tooltip is not dismissed while typing for 10 seconds');</span>&nbsp; <span class='diff-add'> var clockspan = $('<span/>').text('Close');</span>&nbsp; <span class='diff-add'> clockspan.addClass('ui-icon');</span>&nbsp; <span class='diff-add'> clockspan.addClass('ui-icon-clock');</span>&nbsp; <span class='diff-add'> this._clocklink.append(clockspan);</span>&nbsp; <span class='diff-add'> this._clocklink.click(function () {</span>&nbsp; <span class='diff-add'> that.cancel_stick();</span>&nbsp; <span class='diff-add'> event.preventDefault();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> //construct the tooltip</span>&nbsp; <span class='diff-add'> // add in the reverse order you want them to appear</span>&nbsp; <span class='diff-add'> this.buttons.append(closelink);</span>&nbsp; <span class='diff-add'> this.buttons.append(expandlink);</span>&nbsp; <span class='diff-add'> this.buttons.append(morelink);</span>&nbsp; <span class='diff-add'> this.buttons.append(this._clocklink);</span>&nbsp; <span class='diff-add'> this._clocklink.hide();</span>&nbsp; <span class='diff-add'> // we need a phony element to make the small arrow</span>&nbsp; <span class='diff-add'> // of the tooltip in css</span>&nbsp; <span class='diff-add'> // we will move the arrow later</span>&nbsp; <span class='diff-add'> this.arrow = $('<div/>').addClass('pretooltiparrow');</span>&nbsp; <span class='diff-add'> this.tooltip.append(this.buttons);</span>&nbsp; <span class='diff-add'> this.tooltip.append(this.arrow);</span>&nbsp; <span class='diff-add'> this.tooltip.append(this.text);</span>&nbsp; <span class='diff-add'> // function that will be called if you press tab 1, 2, 3... times in a row</span>&nbsp; <span class='diff-add'> this.tabs_functions = [function (cell, text, cursor) {</span>&nbsp; <span class='diff-add'> that._request_tooltip(cell, text, cursor);</span>&nbsp; <span class='diff-add'> }, function () {</span>&nbsp; <span class='diff-add'> that.expand();</span>&nbsp; <span class='diff-add'> }, function () {</span>&nbsp; <span class='diff-add'> that.stick();</span>&nbsp; <span class='diff-add'> }, function (cell) {</span>&nbsp; <span class='diff-add'> that.cancel_stick();</span>&nbsp; <span class='diff-add'> that.showInPager(cell);</span>&nbsp; <span class='diff-add'> }];</span>&nbsp; <span class='diff-add'> // call after all the tabs function above have bee call to clean their effects</span>&nbsp; <span class='diff-add'> // if necessary</span>&nbsp; <span class='diff-add'> this.reset_tabs_function = function (cell, text) {</span>&nbsp; <span class='diff-add'> this._old_cell = (cell) ? cell : null;</span>&nbsp; <span class='diff-add'> this._old_request = (text) ? text : null;</span>&nbsp; <span class='diff-add'> this._consecutive_counter = 0;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Tooltip.prototype.is_visible = function () {</span>&nbsp; <span class='diff-add'> return !this._hidden;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> Tooltip.prototype.showInPager = function (cell) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * reexecute last call in pager by appending ? to show back in pager</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.events.trigger('open_with_text.Pager', this._reply.content);</span>&nbsp; <span class='diff-add'> this.remove_and_cancel_tooltip();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // grow the tooltip verticaly</span>&nbsp; <span class='diff-add'> Tooltip.prototype.expand = function () {</span>&nbsp; <span class='diff-add'> this.text.removeClass('smalltooltip');</span>&nbsp; <span class='diff-add'> this.text.addClass('bigtooltip');</span>&nbsp; <span class='diff-add'> $('#expanbutton').hide('slow');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // deal with all the logic of hiding the tooltip</span>&nbsp; <span class='diff-add'> // and reset it's status</span>&nbsp; <span class='diff-add'> Tooltip.prototype._hide = function () {</span>&nbsp; <span class='diff-add'> this._hidden = true;</span>&nbsp; <span class='diff-add'> this.tooltip.fadeOut('fast');</span>&nbsp; <span class='diff-add'> $('#expanbutton').show('slow');</span>&nbsp; <span class='diff-add'> this.text.removeClass('bigtooltip');</span>&nbsp; <span class='diff-add'> this.text.addClass('smalltooltip');</span>&nbsp; <span class='diff-add'> // keep scroll top to be sure to always see the first line</span>&nbsp; <span class='diff-add'> this.text.scrollTop(0);</span>&nbsp; <span class='diff-add'> this.code_mirror = null;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // return true on successfully removing a visible tooltip; otherwise return</span>&nbsp; <span class='diff-add'> // false.</span>&nbsp; <span class='diff-add'> Tooltip.prototype.remove_and_cancel_tooltip = function (force) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * note that we don't handle closing directly inside the calltip</span>&nbsp; <span class='diff-add'> * as in the completer, because it is not focusable, so won't</span>&nbsp; <span class='diff-add'> * get the event.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.cancel_pending();</span>&nbsp; <span class='diff-add'> if (!this._hidden) {</span>&nbsp; <span class='diff-add'> if (force || !this._sticky) {</span>&nbsp; <span class='diff-add'> this.cancel_stick();</span>&nbsp; <span class='diff-add'> this._hide();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.reset_tabs_function();</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // cancel autocall done after '(' for example.</span>&nbsp; <span class='diff-add'> Tooltip.prototype.cancel_pending = function () {</span>&nbsp; <span class='diff-add'> if (this._tooltip_timeout !== null) {</span>&nbsp; <span class='diff-add'> clearTimeout(this._tooltip_timeout);</span>&nbsp; <span class='diff-add'> this._tooltip_timeout = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // will trigger tooltip after timeout</span>&nbsp; <span class='diff-add'> Tooltip.prototype.pending = function (cell, hide_if_no_docstring) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this._tooltip_timeout = setTimeout(function () {</span>&nbsp; <span class='diff-add'> that.request(cell, hide_if_no_docstring);</span>&nbsp; <span class='diff-add'> }, that.time_before_tooltip);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // easy access for julia monkey patching.</span>&nbsp; <span class='diff-add'> Tooltip.last_token_re = /[a-z_][0-9a-z._]*$/gi;</span>&nbsp; <span class='diff-add'> Tooltip.prototype._request_tooltip = function (cell, text, cursor_pos) {</span>&nbsp; <span class='diff-add'> var callbacks = $.proxy(this._show, this);</span>&nbsp; <span class='diff-add'> var msg_id = cell.kernel.inspect(text, cursor_pos, callbacks);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // make an immediate completion request</span>&nbsp; <span class='diff-add'> Tooltip.prototype.request = function (cell, hide_if_no_docstring) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * request(codecell)</span>&nbsp; <span class='diff-add'> * Deal with extracting the text from the cell and counting</span>&nbsp; <span class='diff-add'> * call in a row</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.cancel_pending();</span>&nbsp; <span class='diff-add'> var editor = cell.code_mirror;</span>&nbsp; <span class='diff-add'> var cursor = editor.getCursor();</span>&nbsp; <span class='diff-add'> var cursor_pos = utils.to_absolute_cursor_pos(editor, cursor);</span>&nbsp; <span class='diff-add'> var text = cell.get_text();</span>&nbsp; <span class='diff-add'> this._hide_if_no_docstring = hide_if_no_docstring;</span>&nbsp; <span class='diff-add'> if(editor.somethingSelected()){</span>&nbsp; <span class='diff-add'> // get only the most recent selection.</span>&nbsp; <span class='diff-add'> text = editor.getSelection();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // need a permanent handle to code_mirror for future auto recall</span>&nbsp; <span class='diff-add'> this.code_mirror = editor;</span>&nbsp; <span class='diff-add'> // now we treat the different number of keypress</span>&nbsp; <span class='diff-add'> // first if same cell, same text, increment counter by 1</span>&nbsp; <span class='diff-add'> if (this._old_cell == cell && this._old_request == text && this._hidden === false) {</span>&nbsp; <span class='diff-add'> this._consecutive_counter++;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // else reset</span>&nbsp; <span class='diff-add'> this.cancel_stick();</span>&nbsp; <span class='diff-add'> this.reset_tabs_function (cell, text);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.tabs_functions[this._consecutive_counter](cell, text, cursor_pos);</span>&nbsp; <span class='diff-add'> // then if we are at the end of list function, reset</span>&nbsp; <span class='diff-add'> if (this._consecutive_counter == this.tabs_functions.length) {</span>&nbsp; <span class='diff-add'> this.reset_tabs_function (cell, text, cursor);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // cancel the option of having the tooltip to stick</span>&nbsp; <span class='diff-add'> Tooltip.prototype.cancel_stick = function () {</span>&nbsp; <span class='diff-add'> clearTimeout(this._stick_timeout);</span>&nbsp; <span class='diff-add'> this._stick_timeout = null;</span>&nbsp; <span class='diff-add'> this._clocklink.hide('slow');</span>&nbsp; <span class='diff-add'> this._sticky = false;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // put the tooltip in a sicky state for 10 seconds</span>&nbsp; <span class='diff-add'> // it won't be removed by remove_and_cancell() unless you called with</span>&nbsp; <span class='diff-add'> // the first parameter set to true.</span>&nbsp; <span class='diff-add'> // remove_and_cancell_tooltip(true)</span>&nbsp; <span class='diff-add'> Tooltip.prototype.stick = function (time) {</span>&nbsp; <span class='diff-add'> time = (time !== undefined) ? time : 10;</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this._sticky = true;</span>&nbsp; <span class='diff-add'> this._clocklink.show('slow');</span>&nbsp; <span class='diff-add'> this._stick_timeout = setTimeout(function () {</span>&nbsp; <span class='diff-add'> that._sticky = false;</span>&nbsp; <span class='diff-add'> that._clocklink.hide('slow');</span>&nbsp; <span class='diff-add'> }, time * 1000);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // should be called with the kernel reply to actually show the tooltip</span>&nbsp; <span class='diff-add'> Tooltip.prototype._show = function (reply) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * move the bubble if it is not hidden</span>&nbsp; <span class='diff-add'> * otherwise fade it</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this._reply = reply;</span>&nbsp; <span class='diff-add'> var content = reply.content;</span>&nbsp; <span class='diff-add'> if (!content.found) {</span>&nbsp; <span class='diff-add'> // object not found, nothing to show</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.name = content.name;</span>&nbsp; <span class='diff-add'> // do some math to have the tooltip arrow on more or less on left or right</span>&nbsp; <span class='diff-add'> // position of the editor</span>&nbsp; <span class='diff-add'> var cm_pos = $(this.code_mirror.getWrapperElement()).position();</span>&nbsp; <span class='diff-add'> // anchor and head positions are local within CodeMirror element</span>&nbsp; <span class='diff-add'> var anchor = this.code_mirror.cursorCoords(false, 'local');</span>&nbsp; <span class='diff-add'> var head = this.code_mirror.cursorCoords(true, 'local');</span>&nbsp; <span class='diff-add'> // locate the target at the center of anchor, head</span>&nbsp; <span class='diff-add'> var center_left = (head.left + anchor.left) / 2;</span>&nbsp; <span class='diff-add'> // locate the left edge of the tooltip, at most 450 px left of the arrow</span>&nbsp; <span class='diff-add'> var edge_left = Math.max(center_left - 450, 0);</span>&nbsp; <span class='diff-add'> // locate the arrow at the cursor. A 24 px offset seems necessary.</span>&nbsp; <span class='diff-add'> var arrow_left = center_left - edge_left - 24;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // locate left, top within container element</span>&nbsp; <span class='diff-add'> var left = (cm_pos.left + edge_left) + 'px';</span>&nbsp; <span class='diff-add'> var top = (cm_pos.top + head.bottom + 10) + 'px';</span>&nbsp; <span class='diff-add'> if (this._hidden === false) {</span>&nbsp; <span class='diff-add'> this.tooltip.animate({</span>&nbsp; <span class='diff-add'> left: left,</span>&nbsp; <span class='diff-add'> top: top</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.tooltip.css({</span>&nbsp; <span class='diff-add'> left: left</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.tooltip.css({</span>&nbsp; <span class='diff-add'> top: top</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.arrow.animate({</span>&nbsp; <span class='diff-add'> 'left': arrow_left + 'px'</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this._hidden = false;</span>&nbsp; <span class='diff-add'> this.tooltip.fadeIn('fast');</span>&nbsp; <span class='diff-add'> this.text.children().remove();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // This should support rich data types, but only text/plain for now</span>&nbsp; <span class='diff-add'> // Any HTML within the docstring is escaped by the fixConsole() method.</span>&nbsp; <span class='diff-add'> var pre = $('<pre/>').html(utils.fixConsole(content.data['text/plain']));</span>&nbsp; <span class='diff-add'> this.text.append(pre);</span>&nbsp; <span class='diff-add'> // keep scroll top to be sure to always see the first line</span>&nbsp; <span class='diff-add'> this.text.scrollTop(0);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatibility.</span>&nbsp; <span class='diff-add'> IPython.Tooltip = Tooltip;</span>&nbsp; <span class='diff-add'> return {'Tooltip': Tooltip};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/tour.js b/ipynb/Array-feature-overlap-05_files/tour.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..78f23cc</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/tour.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'bootstraptour',</span>&nbsp; <span class='diff-add'>], function(IPython, $, Tour) {</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var tour_style = "<div class='popover tour'>\n" +</span>&nbsp; <span class='diff-add'> "<div class='arrow'></div>\n" +</span>&nbsp; <span class='diff-add'> "<div style='position:absolute; top:7px; right:7px'>\n" +</span>&nbsp; <span class='diff-add'> "<button class='btn btn-default btn-sm fa fa-times' data-role='end'></button>\n" +</span>&nbsp; <span class='diff-add'> "</div><h3 class='popover-title'></h3>\n" +</span>&nbsp; <span class='diff-add'> "<div class='popover-content'></div>\n" +</span>&nbsp; <span class='diff-add'> "<div class='popover-navigation'>\n" +</span>&nbsp; <span class='diff-add'> "<button class='btn btn-default fa fa-step-backward' data-role='prev'></button>\n" +</span>&nbsp; <span class='diff-add'> "<button class='btn btn-default fa fa-step-forward pull-right' data-role='next'></button>\n" +</span>&nbsp; <span class='diff-add'> "<button id='tour-pause' class='btn btn-sm btn-default fa fa-pause' data-resume-text='' data-pause-text='' data-role='pause-resume'></button>\n" +</span>&nbsp; <span class='diff-add'> "</div>\n" +</span>&nbsp; <span class='diff-add'> "</div>";</span>&nbsp; <span class='diff-add'> var NotebookTour = function (notebook, events) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.notebook = notebook;</span>&nbsp; <span class='diff-add'> this.step_duration = 0;</span>&nbsp; <span class='diff-add'> this.events = events;</span>&nbsp; <span class='diff-add'> this.tour_steps = [</span>&nbsp; <span class='diff-add'> { </span>&nbsp; <span class='diff-add'> title: "Welcome to the Notebook Tour",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> orphan: true,</span>&nbsp; <span class='diff-add'> content: "You can use the left and right arrow keys to go backwards and forwards."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: "#notebook_name",</span>&nbsp; <span class='diff-add'> title: "Filename",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> content: "Click here to change the filename for this notebook."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: $("#menus").parent(),</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> title: "Notebook Menubar",</span>&nbsp; <span class='diff-add'> content: "The menubar has menus for actions on the notebook, its cells, and the kernel it communicates with."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: "#maintoolbar",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> title: "Notebook Toolbar",</span>&nbsp; <span class='diff-add'> content: "The toolbar has buttons for the most common actions. Hover your mouse over each button for more information."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: "#modal_indicator",</span>&nbsp; <span class='diff-add'> title: "Mode Indicator",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> content: "The Notebook has two modes: Edit Mode and Command Mode. In this area, an indicator can appear to tell you which mode you are in.",</span>&nbsp; <span class='diff-add'> onShow: function(tour) { that.command_icon_hack(); }</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: "#modal_indicator",</span>&nbsp; <span class='diff-add'> title: "Command Mode",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> onShow: function(tour) { notebook.command_mode(); that.command_icon_hack(); },</span>&nbsp; <span class='diff-add'> onNext: function(tour) { that.edit_mode(); },</span>&nbsp; <span class='diff-add'> content: "Right now you are in Command Mode, and many keyboard shortcuts are available. In this mode, no icon is displayed in the indicator area."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: "#modal_indicator",</span>&nbsp; <span class='diff-add'> title: "Edit Mode",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> onShow: function(tour) { that.edit_mode(); },</span>&nbsp; <span class='diff-add'> content: "Pressing <code>Enter</code> or clicking in the input text area of the cell switches to Edit Mode."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: '.selected',</span>&nbsp; <span class='diff-add'> title: "Edit Mode",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> onShow: function(tour) { that.edit_mode(); },</span>&nbsp; <span class='diff-add'> content: "Notice that the border around the currently active cell changed color. Typing will insert text into the currently active cell."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: '.selected',</span>&nbsp; <span class='diff-add'> title: "Back to Command Mode",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> onShow: function(tour) { notebook.command_mode(); },</span>&nbsp; <span class='diff-add'> onHide: function(tour) { $('#help_menu').parent().children('a').click(); },</span>&nbsp; <span class='diff-add'> content: "Pressing <code>Esc</code> or clicking outside of the input text area takes you back to Command Mode."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: '#keyboard_shortcuts',</span>&nbsp; <span class='diff-add'> title: "Keyboard Shortcuts",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> onHide: function(tour) { $('#help_menu').parent().children('a').click(); },</span>&nbsp; <span class='diff-add'> content: "You can click here to get a list of all of the keyboard shortcuts."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: "#kernel_indicator_icon",</span>&nbsp; <span class='diff-add'> title: "Kernel Indicator",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> onShow: function(tour) { events.trigger('kernel_idle.Kernel');},</span>&nbsp; <span class='diff-add'> content: "This is the Kernel indicator. It looks like this when the Kernel is idle."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: "#kernel_indicator_icon",</span>&nbsp; <span class='diff-add'> title: "Kernel Indicator",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> onShow: function(tour) { events.trigger('kernel_busy.Kernel'); },</span>&nbsp; <span class='diff-add'> content: "The Kernel indicator looks like this when the Kernel is busy."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: ".fa-stop",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> title: "Interrupting the Kernel",</span>&nbsp; <span class='diff-add'> onHide: function(tour) { events.trigger('kernel_idle.Kernel'); },</span>&nbsp; <span class='diff-add'> content: "To cancel a computation in progress, you can click here."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> element: "#notification_kernel",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> onShow: function(tour) { $('.fa-stop').click(); },</span>&nbsp; <span class='diff-add'> title: "Notification Area",</span>&nbsp; <span class='diff-add'> content: "Messages in response to user actions (Save, Interrupt, etc) appear here."</span>&nbsp; <span class='diff-add'> }, {</span>&nbsp; <span class='diff-add'> title: "Fin.",</span>&nbsp; <span class='diff-add'> placement: 'bottom',</span>&nbsp; <span class='diff-add'> orphan: true,</span>&nbsp; <span class='diff-add'> content: "This concludes the IPython Notebook User Interface Tour. Happy hacking!"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> ];</span>&nbsp; <span class='diff-add'> this.tour = new Tour({</span>&nbsp; <span class='diff-add'> storage: false, // start tour from beginning every time</span>&nbsp; <span class='diff-add'> debug: true,</span>&nbsp; <span class='diff-add'> reflex: true, // click on element to continue tour</span>&nbsp; <span class='diff-add'> animation: false,</span>&nbsp; <span class='diff-add'> duration: this.step_duration,</span>&nbsp; <span class='diff-add'> onStart: function() { console.log('tour started'); },</span>&nbsp; <span class='diff-add'> // TODO: remove the onPause/onResume logic once pi's patch has been</span>&nbsp; <span class='diff-add'> // merged upstream to make this work via data-resume-class and </span>&nbsp; <span class='diff-add'> // data-resume-text attributes.</span>&nbsp; <span class='diff-add'> onPause: this.toggle_pause_play,</span>&nbsp; <span class='diff-add'> onResume: this.toggle_pause_play,</span>&nbsp; <span class='diff-add'> steps: this.tour_steps,</span>&nbsp; <span class='diff-add'> template: tour_style,</span>&nbsp; <span class='diff-add'> orphan: true</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> NotebookTour.prototype.start = function () {</span>&nbsp; <span class='diff-add'> console.log("let's start the tour");</span>&nbsp; <span class='diff-add'> this.tour.init();</span>&nbsp; <span class='diff-add'> this.tour.start();</span>&nbsp; <span class='diff-add'> if (this.tour.ended())</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> this.tour.restart();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> NotebookTour.prototype.command_icon_hack = function() {</span>&nbsp; <span class='diff-add'> $('#modal_indicator').css('min-height', 20);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> NotebookTour.prototype.toggle_pause_play = function () { </span>&nbsp; <span class='diff-add'> $('#tour-pause').toggleClass('fa-pause fa-play'); </span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> NotebookTour.prototype.edit_mode = function() { </span>&nbsp; <span class='diff-add'> this.notebook.focus_cell(); </span>&nbsp; <span class='diff-add'> this.notebook.edit_mode();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // For backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.NotebookTour = NotebookTour;</span>&nbsp; <span class='diff-add'> return {'Tour': NotebookTour};</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/underscore-min.js b/ipynb/Array-feature-overlap-05_files/underscore-min.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..d22f881</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/underscore-min.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Underscore.js 1.5.2</span>&nbsp; <span class='diff-add'>// http://underscorejs.org</span>&nbsp; <span class='diff-add'>// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors</span>&nbsp; <span class='diff-add'>// Underscore may be freely distributed under the MIT license.</span>&nbsp; <span class='diff-add'>(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?(this._wrapped=n,void 0):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.5.2";var A=j.each=j.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var E="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(E);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(E);return r},j.find=j.detect=function(n,t,r){var e;return O(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var O=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:O(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,function(n){return n[t]})},j.where=function(n,t,r){return j.isEmpty(t)?r?void 0:[]:j[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},j.findWhere=function(n,t){return j.where(n,t,!0)},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);if(!t&&j.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>e.computed&&(e={value:n,computed:a})}),e.value},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);if(!t&&j.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a<e.computed&&(e={value:n,computed:a})}),e.value},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e},j.sample=function(n,t,r){return arguments.length<2||r?n[j.random(n.length-1)]:j.shuffle(n).slice(0,Math.max(0,t))};var k=function(n){return j.isFunction(n)?n:function(t){return t[n]}};j.sortBy=function(n,t,r){var e=k(t);return j.pluck(j.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={},i=null==r?j.identity:k(r);return A(t,function(r,a){var o=i.call(e,r,a,t);n(u,o,r)}),u}};j.groupBy=F(function(n,t,r){(j.has(n,t)?n[t]:n[t]=[]).push(r)}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=null==r?j.identity:k(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])<u?i=o+1:a=o}return i},j.toArray=function(n){return n?j.isArray(n)?o.call(n):n.length===+n.length?j.map(n,j.identity):j.values(n):[]},j.size=function(n){return null==n?0:n.length===+n.length?n.length:j.keys(n).length},j.first=j.head=j.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var M=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):M(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return M(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.indexOf(t,n)>=0})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=r.leading===!1?0:new Date,a=null,i=n.apply(e,u)};return function(){var l=new Date;o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u)):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o;return function(){i=this,u=arguments,a=new Date;var c=function(){var l=new Date-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u)))},l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u)),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=w||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var I={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"}};I.unescape=j.invert(I.escape);var T={escape:new RegExp("["+j.keys(I.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(I.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(T[n],function(t){return I[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this);</span>&nbsp; <span class='diff-add'>//# sourceMappingURL=underscore-min.map</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/utils.js b/ipynb/Array-feature-overlap-05_files/utils.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..c4659ab</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/utils.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> 'base/js/namespace',</span>&nbsp; <span class='diff-add'> 'jquery',</span>&nbsp; <span class='diff-add'> 'codemirror/lib/codemirror',</span>&nbsp; <span class='diff-add'> 'moment',</span>&nbsp; <span class='diff-add'> // silently upgrades CodeMirror</span>&nbsp; <span class='diff-add'> 'codemirror/mode/meta',</span>&nbsp; <span class='diff-add'>], function(IPython, $, CodeMirror, moment){</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var load_extensions = function () {</span>&nbsp; <span class='diff-add'> // load one or more IPython notebook extensions with requirejs</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var extensions = [];</span>&nbsp; <span class='diff-add'> var extension_names = arguments;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < extension_names.length; i++) {</span>&nbsp; <span class='diff-add'> extensions.push("nbextensions/" + arguments[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> require(extensions,</span>&nbsp; <span class='diff-add'> function () {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < arguments.length; i++) {</span>&nbsp; <span class='diff-add'> var ext = arguments[i];</span>&nbsp; <span class='diff-add'> var ext_name = extension_names[i];</span>&nbsp; <span class='diff-add'> // success callback</span>&nbsp; <span class='diff-add'> console.log("Loaded extension: " + ext_name);</span>&nbsp; <span class='diff-add'> if (ext && ext.load_ipython_extension !== undefined) {</span>&nbsp; <span class='diff-add'> ext.load_ipython_extension();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> function (err) {</span>&nbsp; <span class='diff-add'> // failure callback</span>&nbsp; <span class='diff-add'> console.log("Failed to load extension(s):", err.requireModules, err);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> IPython.load_extensions = load_extensions;</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Wait for a config section to load, and then load the extensions specified</span>&nbsp; <span class='diff-add'> * in a 'load_extensions' key inside it.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> function load_extensions_from_config(section) {</span>&nbsp; <span class='diff-add'> section.loaded.then(function() {</span>&nbsp; <span class='diff-add'> if (section.data.load_extensions) {</span>&nbsp; <span class='diff-add'> var nbextension_paths = Object.getOwnPropertyNames(</span>&nbsp; <span class='diff-add'> section.data.load_extensions);</span>&nbsp; <span class='diff-add'> load_extensions.apply(this, nbextension_paths);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //============================================================================</span>&nbsp; <span class='diff-add'> // Cross-browser RegEx Split</span>&nbsp; <span class='diff-add'> //============================================================================</span>&nbsp; <span class='diff-add'> // This code has been MODIFIED from the code licensed below to not replace the</span>&nbsp; <span class='diff-add'> // default browser split. The license is reproduced here.</span>&nbsp; <span class='diff-add'> // see http://blog.stevenlevithan.com/archives/cross-browser-split for more info:</span>&nbsp; <span class='diff-add'> /*!</span>&nbsp; <span class='diff-add'> * Cross-Browser Split 1.1.1</span>&nbsp; <span class='diff-add'> * Copyright 2007-2012 Steven Levithan <stevenlevithan.com></span>&nbsp; <span class='diff-add'> * Available under the MIT License</span>&nbsp; <span class='diff-add'> * ECMAScript compliant, uniform cross-browser split method</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Splits a string into an array of strings using a regex or string</span>&nbsp; <span class='diff-add'> * separator. Matches of the separator are not included in the result array.</span>&nbsp; <span class='diff-add'> * However, if `separator` is a regex that contains capturing groups,</span>&nbsp; <span class='diff-add'> * backreferences are spliced into the result each time `separator` is</span>&nbsp; <span class='diff-add'> * matched. Fixes browser bugs compared to the native</span>&nbsp; <span class='diff-add'> * `String.prototype.split` and can be used reliably cross-browser.</span>&nbsp; <span class='diff-add'> * @param {String} str String to split.</span>&nbsp; <span class='diff-add'> * @param {RegExp} separator Regex to use for separating</span>&nbsp; <span class='diff-add'> * the string.</span>&nbsp; <span class='diff-add'> * @param {Number} [limit] Maximum number of items to include in the result</span>&nbsp; <span class='diff-add'> * array.</span>&nbsp; <span class='diff-add'> * @returns {Array} Array of substrings.</span>&nbsp; <span class='diff-add'> * @example</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * // Basic use</span>&nbsp; <span class='diff-add'> * regex_split('a b c d', ' ');</span>&nbsp; <span class='diff-add'> * // -> ['a', 'b', 'c', 'd']</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * // With limit</span>&nbsp; <span class='diff-add'> * regex_split('a b c d', ' ', 2);</span>&nbsp; <span class='diff-add'> * // -> ['a', 'b']</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * // Backreferences in result array</span>&nbsp; <span class='diff-add'> * regex_split('..word1 word2..', /([a-z]+)(\d+)/i);</span>&nbsp; <span class='diff-add'> * // -> ['..', 'word', '1', ' ', 'word', '2', '..']</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var regex_split = function (str, separator, limit) {</span>&nbsp; <span class='diff-add'> var output = [],</span>&nbsp; <span class='diff-add'> flags = (separator.ignoreCase ? "i" : "") +</span>&nbsp; <span class='diff-add'> (separator.multiline ? "m" : "") +</span>&nbsp; <span class='diff-add'> (separator.extended ? "x" : "") + // Proposed for ES6</span>&nbsp; <span class='diff-add'> (separator.sticky ? "y" : ""), // Firefox 3+</span>&nbsp; <span class='diff-add'> lastLastIndex = 0,</span>&nbsp; <span class='diff-add'> separator2, match, lastIndex, lastLength;</span>&nbsp; <span class='diff-add'> // Make `global` and avoid `lastIndex` issues by working with a copy</span>&nbsp; <span class='diff-add'> separator = new RegExp(separator.source, flags + "g");</span>&nbsp; <span class='diff-add'> var compliantExecNpcg = typeof(/()??/.exec("")[1]) === "undefined";</span>&nbsp; <span class='diff-add'> if (!compliantExecNpcg) {</span>&nbsp; <span class='diff-add'> // Doesn't need flags gy, but they don't hurt</span>&nbsp; <span class='diff-add'> separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> /* Values for `limit`, per the spec:</span>&nbsp; <span class='diff-add'> * If undefined: 4294967295 // Math.pow(2, 32) - 1</span>&nbsp; <span class='diff-add'> * If 0, Infinity, or NaN: 0</span>&nbsp; <span class='diff-add'> * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;</span>&nbsp; <span class='diff-add'> * If negative number: 4294967296 - Math.floor(Math.abs(limit))</span>&nbsp; <span class='diff-add'> * If other: Type-convert, then use the above rules</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> limit = typeof(limit) === "undefined" ?</span>&nbsp; <span class='diff-add'> -1 >>> 0 : // Math.pow(2, 32) - 1</span>&nbsp; <span class='diff-add'> limit >>> 0; // ToUint32(limit)</span>&nbsp; <span class='diff-add'> for (match = separator.exec(str); match; match = separator.exec(str)) {</span>&nbsp; <span class='diff-add'> // `separator.lastIndex` is not reliable cross-browser</span>&nbsp; <span class='diff-add'> lastIndex = match.index + match[0].length;</span>&nbsp; <span class='diff-add'> if (lastIndex > lastLastIndex) {</span>&nbsp; <span class='diff-add'> output.push(str.slice(lastLastIndex, match.index));</span>&nbsp; <span class='diff-add'> // Fix browsers whose `exec` methods don't consistently return `undefined` for</span>&nbsp; <span class='diff-add'> // nonparticipating capturing groups</span>&nbsp; <span class='diff-add'> if (!compliantExecNpcg && match.length > 1) {</span>&nbsp; <span class='diff-add'> match[0].replace(separator2, function () {</span>&nbsp; <span class='diff-add'> for (var i = 1; i < arguments.length - 2; i++) {</span>&nbsp; <span class='diff-add'> if (typeof(arguments[i]) === "undefined") {</span>&nbsp; <span class='diff-add'> match[i] = undefined;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (match.length > 1 && match.index < str.length) {</span>&nbsp; <span class='diff-add'> Array.prototype.push.apply(output, match.slice(1));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> lastLength = match[0].length;</span>&nbsp; <span class='diff-add'> lastLastIndex = lastIndex;</span>&nbsp; <span class='diff-add'> if (output.length >= limit) {</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (separator.lastIndex === match.index) {</span>&nbsp; <span class='diff-add'> separator.lastIndex++; // Avoid an infinite loop</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (lastLastIndex === str.length) {</span>&nbsp; <span class='diff-add'> if (lastLength || !separator.test("")) {</span>&nbsp; <span class='diff-add'> output.push("");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> output.push(str.slice(lastLastIndex));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return output.length > limit ? output.slice(0, limit) : output;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //============================================================================</span>&nbsp; <span class='diff-add'> // End contributed Cross-browser RegEx Split</span>&nbsp; <span class='diff-add'> //============================================================================</span>&nbsp; <span class='diff-add'> var uuid = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * http://www.ietf.org/rfc/rfc4122.txt</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var s = [];</span>&nbsp; <span class='diff-add'> var hexDigits = "0123456789ABCDEF";</span>&nbsp; <span class='diff-add'> for (var i = 0; i < 32; i++) {</span>&nbsp; <span class='diff-add'> s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> s[12] = "4"; // bits 12-15 of the time_hi_and_version field to 0010</span>&nbsp; <span class='diff-add'> s[16] = hexDigits.substr((s[16] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01</span>&nbsp; <span class='diff-add'> var uuid = s.join("");</span>&nbsp; <span class='diff-add'> return uuid;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> //Fix raw text to parse correctly in crazy XML</span>&nbsp; <span class='diff-add'> function xmlencode(string) {</span>&nbsp; <span class='diff-add'> return string.replace(/\&/g,'&'+'amp;')</span>&nbsp; <span class='diff-add'> .replace(/</g,'&'+'lt;')</span>&nbsp; <span class='diff-add'> .replace(/>/g,'&'+'gt;')</span>&nbsp; <span class='diff-add'> .replace(/\'/g,'&'+'apos;')</span>&nbsp; <span class='diff-add'> .replace(/\"/g,'&'+'quot;')</span>&nbsp; <span class='diff-add'> .replace(/`/g,'&'+'#96;');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> //Map from terminal commands to CSS classes</span>&nbsp; <span class='diff-add'> var ansi_colormap = {</span>&nbsp; <span class='diff-add'> "01":"ansibold",</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> "30":"ansiblack",</span>&nbsp; <span class='diff-add'> "31":"ansired",</span>&nbsp; <span class='diff-add'> "32":"ansigreen",</span>&nbsp; <span class='diff-add'> "33":"ansiyellow",</span>&nbsp; <span class='diff-add'> "34":"ansiblue",</span>&nbsp; <span class='diff-add'> "35":"ansipurple",</span>&nbsp; <span class='diff-add'> "36":"ansicyan",</span>&nbsp; <span class='diff-add'> "37":"ansigray",</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> "40":"ansibgblack",</span>&nbsp; <span class='diff-add'> "41":"ansibgred",</span>&nbsp; <span class='diff-add'> "42":"ansibggreen",</span>&nbsp; <span class='diff-add'> "43":"ansibgyellow",</span>&nbsp; <span class='diff-add'> "44":"ansibgblue",</span>&nbsp; <span class='diff-add'> "45":"ansibgpurple",</span>&nbsp; <span class='diff-add'> "46":"ansibgcyan",</span>&nbsp; <span class='diff-add'> "47":"ansibggray"</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> function _process_numbers(attrs, numbers) {</span>&nbsp; <span class='diff-add'> // process ansi escapes</span>&nbsp; <span class='diff-add'> var n = numbers.shift();</span>&nbsp; <span class='diff-add'> if (ansi_colormap[n]) {</span>&nbsp; <span class='diff-add'> if ( ! attrs["class"] ) {</span>&nbsp; <span class='diff-add'> attrs["class"] = ansi_colormap[n];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> attrs["class"] += " " + ansi_colormap[n];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (n == "38" || n == "48") {</span>&nbsp; <span class='diff-add'> // VT100 256 color or 24 bit RGB</span>&nbsp; <span class='diff-add'> if (numbers.length < 2) {</span>&nbsp; <span class='diff-add'> console.log("Not enough fields for VT100 color", numbers);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var index_or_rgb = numbers.shift();</span>&nbsp; <span class='diff-add'> var r,g,b;</span>&nbsp; <span class='diff-add'> if (index_or_rgb == "5") {</span>&nbsp; <span class='diff-add'> // 256 color</span>&nbsp; <span class='diff-add'> var idx = parseInt(numbers.shift(), 10);</span>&nbsp; <span class='diff-add'> if (idx < 16) {</span>&nbsp; <span class='diff-add'> // indexed ANSI</span>&nbsp; <span class='diff-add'> // ignore bright / non-bright distinction</span>&nbsp; <span class='diff-add'> idx = idx % 8;</span>&nbsp; <span class='diff-add'> var ansiclass = ansi_colormap[n[0] + (idx % 8).toString()];</span>&nbsp; <span class='diff-add'> if ( ! attrs["class"] ) {</span>&nbsp; <span class='diff-add'> attrs["class"] = ansiclass;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> attrs["class"] += " " + ansiclass;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> } else if (idx < 232) {</span>&nbsp; <span class='diff-add'> // 216 color 6x6x6 RGB</span>&nbsp; <span class='diff-add'> idx = idx - 16;</span>&nbsp; <span class='diff-add'> b = idx % 6;</span>&nbsp; <span class='diff-add'> g = Math.floor(idx / 6) % 6;</span>&nbsp; <span class='diff-add'> r = Math.floor(idx / 36) % 6;</span>&nbsp; <span class='diff-add'> // convert to rgb</span>&nbsp; <span class='diff-add'> r = (r * 51);</span>&nbsp; <span class='diff-add'> g = (g * 51);</span>&nbsp; <span class='diff-add'> b = (b * 51);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // grayscale</span>&nbsp; <span class='diff-add'> idx = idx - 231;</span>&nbsp; <span class='diff-add'> // it's 1-24 and should *not* include black or white,</span>&nbsp; <span class='diff-add'> // so a 26 point scale</span>&nbsp; <span class='diff-add'> r = g = b = Math.floor(idx * 256 / 26);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (index_or_rgb == "2") {</span>&nbsp; <span class='diff-add'> // Simple 24 bit RGB</span>&nbsp; <span class='diff-add'> if (numbers.length > 3) {</span>&nbsp; <span class='diff-add'> console.log("Not enough fields for RGB", numbers);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> r = numbers.shift();</span>&nbsp; <span class='diff-add'> g = numbers.shift();</span>&nbsp; <span class='diff-add'> b = numbers.shift();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> console.log("unrecognized control", numbers);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (r !== undefined) {</span>&nbsp; <span class='diff-add'> // apply the rgb color</span>&nbsp; <span class='diff-add'> var line;</span>&nbsp; <span class='diff-add'> if (n == "38") {</span>&nbsp; <span class='diff-add'> line = "color: ";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> line = "background-color: ";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> line = line + "rgb(" + r + "," + g + "," + b + ");";</span>&nbsp; <span class='diff-add'> if ( !attrs.style ) {</span>&nbsp; <span class='diff-add'> attrs.style = line;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> attrs.style += " " + line;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function ansispan(str) {</span>&nbsp; <span class='diff-add'> // ansispan function adapted from github.com/mmalecki/ansispan (MIT License)</span>&nbsp; <span class='diff-add'> // regular ansi escapes (using the table above)</span>&nbsp; <span class='diff-add'> var is_open = false;</span>&nbsp; <span class='diff-add'> return str.replace(/\033\[(0?[01]|22|39)?([;\d]+)?m/g, function(match, prefix, pattern) {</span>&nbsp; <span class='diff-add'> if (!pattern) {</span>&nbsp; <span class='diff-add'> // [(01|22|39|)m close spans</span>&nbsp; <span class='diff-add'> if (is_open) {</span>&nbsp; <span class='diff-add'> is_open = false;</span>&nbsp; <span class='diff-add'> return "</span>";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return "";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> is_open = true;</span>&nbsp; <span class='diff-add'> // consume sequence of color escapes</span>&nbsp; <span class='diff-add'> var numbers = pattern.match(/\d+/g);</span>&nbsp; <span class='diff-add'> var attrs = {};</span>&nbsp; <span class='diff-add'> while (numbers.length > 0) {</span>&nbsp; <span class='diff-add'> _process_numbers(attrs, numbers);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var span = "<span ";</span>&nbsp; <span class='diff-add'> Object.keys(attrs).map(function (attr) {</span>&nbsp; <span class='diff-add'> span = span + " " + attr + '="' + attrs[attr] + '"';</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return span + ">";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Transform ANSI color escape codes into HTML <span> tags with css</span>&nbsp; <span class='diff-add'> // classes listed in the above ansi_colormap object. The actual color used</span>&nbsp; <span class='diff-add'> // are set in the css file.</span>&nbsp; <span class='diff-add'> function fixConsole(txt) {</span>&nbsp; <span class='diff-add'> txt = xmlencode(txt);</span>&nbsp; <span class='diff-add'> // Strip all ANSI codes that are not color related. Matches</span>&nbsp; <span class='diff-add'> // all ANSI codes that do not end with "m".</span>&nbsp; <span class='diff-add'> var ignored_re = /(?=(\033\[[\d;=]*[a-ln-zA-Z]{1}))\1(?!m)/g;</span>&nbsp; <span class='diff-add'> txt = txt.replace(ignored_re, "");</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // color ansi codes</span>&nbsp; <span class='diff-add'> txt = ansispan(txt);</span>&nbsp; <span class='diff-add'> return txt;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Remove chunks that should be overridden by the effect of</span>&nbsp; <span class='diff-add'> // carriage return characters</span>&nbsp; <span class='diff-add'> function fixCarriageReturn(txt) {</span>&nbsp; <span class='diff-add'> var tmp = txt;</span>&nbsp; <span class='diff-add'> do {</span>&nbsp; <span class='diff-add'> txt = tmp;</span>&nbsp; <span class='diff-add'> tmp = txt.replace(/\r+\n/gm, '\n'); // \r followed by \n --> newline</span>&nbsp; <span class='diff-add'> tmp = tmp.replace(/^.*\r+/gm, ''); // Other \r --> clear line</span>&nbsp; <span class='diff-add'> } while (tmp.length < txt.length);</span>&nbsp; <span class='diff-add'> return txt;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Locate any URLs and convert them to a anchor tag</span>&nbsp; <span class='diff-add'> function autoLinkUrls(txt) {</span>&nbsp; <span class='diff-add'> return txt.replace(/(^|\s)(https?|ftp)(:[^'">\s]+)/gi,</span>&nbsp; <span class='diff-add'> "$1<a target=\"_blank\" href=\"$2$3\">$2$3</a>");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var points_to_pixels = function (points) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * A reasonably good way of converting between points and pixels.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var test = $('<div style="display: none; width: 10000pt; padding:0; border:0;"></div>');</span>&nbsp; <span class='diff-add'> $('body').append(test);</span>&nbsp; <span class='diff-add'> var pixel_per_point = test.width()/10000;</span>&nbsp; <span class='diff-add'> test.remove();</span>&nbsp; <span class='diff-add'> return Math.floor(points*pixel_per_point);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var always_new = function (constructor) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * wrapper around contructor to avoid requiring `var a = new constructor()`</span>&nbsp; <span class='diff-add'> * useful for passing constructors as callbacks,</span>&nbsp; <span class='diff-add'> * not for programmer laziness.</span>&nbsp; <span class='diff-add'> * from http://programmers.stackexchange.com/questions/118798</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return function () {</span>&nbsp; <span class='diff-add'> var obj = Object.create(constructor.prototype);</span>&nbsp; <span class='diff-add'> constructor.apply(obj, arguments);</span>&nbsp; <span class='diff-add'> return obj;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var url_path_join = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * join a sequence of url components with '/'</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var url = '';</span>&nbsp; <span class='diff-add'> for (var i = 0; i < arguments.length; i++) {</span>&nbsp; <span class='diff-add'> if (arguments[i] === '') {</span>&nbsp; <span class='diff-add'> continue;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (url.length > 0 && url[url.length-1] != '/') {</span>&nbsp; <span class='diff-add'> url = url + '/' + arguments[i];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> url = url + arguments[i];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> url = url.replace(/\/\/+/, '/');</span>&nbsp; <span class='diff-add'> return url;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var url_path_split = function (path) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Like os.path.split for URLs.</span>&nbsp; <span class='diff-add'> * Always returns two strings, the directory path and the base filename</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var idx = path.lastIndexOf('/');</span>&nbsp; <span class='diff-add'> if (idx === -1) {</span>&nbsp; <span class='diff-add'> return ['', path];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return [ path.slice(0, idx), path.slice(idx + 1) ];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var parse_url = function (url) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * an `a` element with an href allows attr-access to the parsed segments of a URL</span>&nbsp; <span class='diff-add'> * a = parse_url("http://localhost:8888/path/name#hash")</span>&nbsp; <span class='diff-add'> * a.protocol = "http:"</span>&nbsp; <span class='diff-add'> * a.host = "localhost:8888"</span>&nbsp; <span class='diff-add'> * a.hostname = "localhost"</span>&nbsp; <span class='diff-add'> * a.port = 8888</span>&nbsp; <span class='diff-add'> * a.pathname = "/path/name"</span>&nbsp; <span class='diff-add'> * a.hash = "#hash"</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var a = document.createElement("a");</span>&nbsp; <span class='diff-add'> a.href = url;</span>&nbsp; <span class='diff-add'> return a;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var encode_uri_components = function (uri) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * encode just the components of a multi-segment uri,</span>&nbsp; <span class='diff-add'> * leaving '/' separators</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return uri.split('/').map(encodeURIComponent).join('/');</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var url_join_encode = function () {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * join a sequence of url components with '/',</span>&nbsp; <span class='diff-add'> * encoding each component with encodeURIComponent</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return encode_uri_components(url_path_join.apply(null, arguments));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var splitext = function (filename) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * mimic Python os.path.splitext</span>&nbsp; <span class='diff-add'> * Returns ['base', '.ext']</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var idx = filename.lastIndexOf('.');</span>&nbsp; <span class='diff-add'> if (idx > 0) {</span>&nbsp; <span class='diff-add'> return [filename.slice(0, idx), filename.slice(idx)];</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return [filename, ''];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var escape_html = function (text) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * escape text to HTML</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return $("<div/>").text(text).html();</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var get_body_data = function(key) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * get a url-encoded item from body.data and decode it</span>&nbsp; <span class='diff-add'> * we should never have any encoded URLs anywhere else in code</span>&nbsp; <span class='diff-add'> * until we are building an actual request</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var val = $('body').data(key);</span>&nbsp; <span class='diff-add'> if (!val)</span>&nbsp; <span class='diff-add'> return val;</span>&nbsp; <span class='diff-add'> return decodeURIComponent(val);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var to_absolute_cursor_pos = function (cm, cursor) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * get the absolute cursor position from CodeMirror's col, ch</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (!cursor) {</span>&nbsp; <span class='diff-add'> cursor = cm.getCursor();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var cursor_pos = cursor.ch;</span>&nbsp; <span class='diff-add'> for (var i = 0; i < cursor.line; i++) {</span>&nbsp; <span class='diff-add'> cursor_pos += cm.getLine(i).length + 1;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return cursor_pos;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var from_absolute_cursor_pos = function (cm, cursor_pos) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * turn absolute cursor postion into CodeMirror col, ch cursor</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var i, line;</span>&nbsp; <span class='diff-add'> var offset = 0;</span>&nbsp; <span class='diff-add'> for (i = 0, line=cm.getLine(i); line !== undefined; i++, line=cm.getLine(i)) {</span>&nbsp; <span class='diff-add'> if (offset + line.length < cursor_pos) {</span>&nbsp; <span class='diff-add'> offset += line.length + 1;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> line : i,</span>&nbsp; <span class='diff-add'> ch : cursor_pos - offset,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // reached end, return endpoint</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> ch : line.length - 1,</span>&nbsp; <span class='diff-add'> line : i - 1,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // http://stackoverflow.com/questions/2400935/browser-detection-in-javascript</span>&nbsp; <span class='diff-add'> var browser = (function() {</span>&nbsp; <span class='diff-add'> if (typeof navigator === 'undefined') {</span>&nbsp; <span class='diff-add'> // navigator undefined in node</span>&nbsp; <span class='diff-add'> return 'None';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var N= navigator.appName, ua= navigator.userAgent, tem;</span>&nbsp; <span class='diff-add'> var M= ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);</span>&nbsp; <span class='diff-add'> if (M && (tem= ua.match(/version\/([\.\d]+)/i)) !== null) M[2]= tem[1];</span>&nbsp; <span class='diff-add'> M= M? [M[1], M[2]]: [N, navigator.appVersion,'-?'];</span>&nbsp; <span class='diff-add'> return M;</span>&nbsp; <span class='diff-add'> })();</span>&nbsp; <span class='diff-add'> // http://stackoverflow.com/questions/11219582/how-to-detect-my-browser-version-and-operating-system-using-javascript</span>&nbsp; <span class='diff-add'> var platform = (function () {</span>&nbsp; <span class='diff-add'> if (typeof navigator === 'undefined') {</span>&nbsp; <span class='diff-add'> // navigator undefined in node</span>&nbsp; <span class='diff-add'> return 'None';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var OSName="None";</span>&nbsp; <span class='diff-add'> if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows";</span>&nbsp; <span class='diff-add'> if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS";</span>&nbsp; <span class='diff-add'> if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";</span>&nbsp; <span class='diff-add'> if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux";</span>&nbsp; <span class='diff-add'> return OSName;</span>&nbsp; <span class='diff-add'> })();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var get_url_param = function (name) {</span>&nbsp; <span class='diff-add'> // get a URL parameter. I cannot believe we actually need this.</span>&nbsp; <span class='diff-add'> // Based on http://stackoverflow.com/a/25359264/938949</span>&nbsp; <span class='diff-add'> var match = new RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);</span>&nbsp; <span class='diff-add'> if (match){</span>&nbsp; <span class='diff-add'> return decodeURIComponent(match[1] || '');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var is_or_has = function (a, b) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Is b a child of a or a itself?</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return a.has(b).length !==0 || a.is(b);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var is_focused = function (e) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Is element e, or one of its children focused?</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> e = $(e);</span>&nbsp; <span class='diff-add'> var target = $(document.activeElement);</span>&nbsp; <span class='diff-add'> if (target.length > 0) {</span>&nbsp; <span class='diff-add'> if (is_or_has(e, target)) {</span>&nbsp; <span class='diff-add'> return true;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var mergeopt = function(_class, options, overwrite){</span>&nbsp; <span class='diff-add'> options = options || {};</span>&nbsp; <span class='diff-add'> overwrite = overwrite || {};</span>&nbsp; <span class='diff-add'> return $.extend(true, {}, _class.options_default, options, overwrite);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var ajax_error_msg = function (jqXHR) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Return a JSON error message if there is one,</span>&nbsp; <span class='diff-add'> * otherwise the basic HTTP status text.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (jqXHR.responseJSON && jqXHR.responseJSON.traceback) {</span>&nbsp; <span class='diff-add'> return jqXHR.responseJSON.traceback;</span>&nbsp; <span class='diff-add'> } else if (jqXHR.responseJSON && jqXHR.responseJSON.message) {</span>&nbsp; <span class='diff-add'> return jqXHR.responseJSON.message;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return jqXHR.statusText;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var log_ajax_error = function (jqXHR, status, error) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * log ajax failures with informative messages</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var msg = "API request failed (" + jqXHR.status + "): ";</span>&nbsp; <span class='diff-add'> console.log(jqXHR);</span>&nbsp; <span class='diff-add'> msg += ajax_error_msg(jqXHR);</span>&nbsp; <span class='diff-add'> console.log(msg);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var requireCodeMirrorMode = function (mode, callback, errback) {</span>&nbsp; <span class='diff-add'> /** </span>&nbsp; <span class='diff-add'> * find a predefined mode or detect from CM metadata then</span>&nbsp; <span class='diff-add'> * require and callback with the resolveable mode string: mime or</span>&nbsp; <span class='diff-add'> * custom name</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var modename = (typeof mode == "string") ? mode :</span>&nbsp; <span class='diff-add'> mode.mode || mode.name;</span>&nbsp; <span class='diff-add'> // simplest, cheapest check by mode name: mode may also have config</span>&nbsp; <span class='diff-add'> if (CodeMirror.modes.hasOwnProperty(modename)) {</span>&nbsp; <span class='diff-add'> // return the full mode object, if it has a name</span>&nbsp; <span class='diff-add'> callback(mode.name ? mode : modename);</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // *somehow* get back a CM.modeInfo-like object that has .mode and</span>&nbsp; <span class='diff-add'> // .mime</span>&nbsp; <span class='diff-add'> var info = (mode && mode.mode && mode.mime && mode) ||</span>&nbsp; <span class='diff-add'> CodeMirror.findModeByName(modename) ||</span>&nbsp; <span class='diff-add'> CodeMirror.findModeByExtension(modename.split(".").slice(-1)) ||</span>&nbsp; <span class='diff-add'> CodeMirror.findModeByMIME(modename) ||</span>&nbsp; <span class='diff-add'> {mode: modename, mime: modename};</span>&nbsp; <span class='diff-add'> require([</span>&nbsp; <span class='diff-add'> // might want to use CodeMirror.modeURL here</span>&nbsp; <span class='diff-add'> ['codemirror/mode', info.mode, info.mode].join('/'),</span>&nbsp; <span class='diff-add'> ], function() {</span>&nbsp; <span class='diff-add'> // return the original mode, as from a kernelspec on first load</span>&nbsp; <span class='diff-add'> // or the mimetype, as for most highlighting</span>&nbsp; <span class='diff-add'> callback(mode.name ? mode : info.mime);</span>&nbsp; <span class='diff-add'> }, errback</span>&nbsp; <span class='diff-add'> );</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /** Error type for wrapped XHR errors. */</span>&nbsp; <span class='diff-add'> var XHR_ERROR = 'XhrError';</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Wraps an AJAX error as an Error object.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var wrap_ajax_error = function (jqXHR, status, error) {</span>&nbsp; <span class='diff-add'> var wrapped_error = new Error(ajax_error_msg(jqXHR));</span>&nbsp; <span class='diff-add'> wrapped_error.name = XHR_ERROR;</span>&nbsp; <span class='diff-add'> // provide xhr response</span>&nbsp; <span class='diff-add'> wrapped_error.xhr = jqXHR;</span>&nbsp; <span class='diff-add'> wrapped_error.xhr_status = status;</span>&nbsp; <span class='diff-add'> wrapped_error.xhr_error = error;</span>&nbsp; <span class='diff-add'> return wrapped_error;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var promising_ajax = function(url, settings) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Like $.ajax, but returning an ES6 promise. success and error settings</span>&nbsp; <span class='diff-add'> * will be ignored.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> settings = settings || {};</span>&nbsp; <span class='diff-add'> return new Promise(function(resolve, reject) {</span>&nbsp; <span class='diff-add'> settings.success = function(data, status, jqXHR) {</span>&nbsp; <span class='diff-add'> resolve(data);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> settings.error = function(jqXHR, status, error) {</span>&nbsp; <span class='diff-add'> log_ajax_error(jqXHR, status, error);</span>&nbsp; <span class='diff-add'> reject(wrap_ajax_error(jqXHR, status, error));</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> $.ajax(url, settings);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var WrappedError = function(message, error){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Wrappable Error class</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * The Error class doesn't actually act on `this`. Instead it always</span>&nbsp; <span class='diff-add'> * returns a new instance of Error. Here we capture that instance so we</span>&nbsp; <span class='diff-add'> * can apply it's properties to `this`.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var tmp = Error.apply(this, [message]);</span>&nbsp; <span class='diff-add'> // Copy the properties of the error over to this.</span>&nbsp; <span class='diff-add'> var properties = Object.getOwnPropertyNames(tmp);</span>&nbsp; <span class='diff-add'> for (var i = 0; i < properties.length; i++) {</span>&nbsp; <span class='diff-add'> this[properties[i]] = tmp[properties[i]];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Keep a stack of the original error messages.</span>&nbsp; <span class='diff-add'> if (error instanceof WrappedError) {</span>&nbsp; <span class='diff-add'> this.error_stack = error.error_stack;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.error_stack = [error];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.error_stack.push(tmp);</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> WrappedError.prototype = Object.create(Error.prototype, {});</span>&nbsp; <span class='diff-add'> var load_class = function(class_name, module_name, registry) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Tries to load a class</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Tries to load a class from a module using require.js, if a module </span>&nbsp; <span class='diff-add'> * is specified, otherwise tries to load a class from the global </span>&nbsp; <span class='diff-add'> * registry, if the global registry is provided.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return new Promise(function(resolve, reject) {</span>&nbsp; <span class='diff-add'> // Try loading the view module using require.js</span>&nbsp; <span class='diff-add'> if (module_name) {</span>&nbsp; <span class='diff-add'> require([module_name], function(module) {</span>&nbsp; <span class='diff-add'> if (module[class_name] === undefined) {</span>&nbsp; <span class='diff-add'> reject(new Error('Class '+class_name+' not found in module '+module_name));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> resolve(module[class_name]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, reject);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> if (registry && registry[class_name]) {</span>&nbsp; <span class='diff-add'> resolve(registry[class_name]);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> reject(new Error('Class '+class_name+' not found in registry '));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var resolve_promises_dict = function(d) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Resolve a promiseful dictionary.</span>&nbsp; <span class='diff-add'> * Returns a single Promise.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var keys = Object.keys(d);</span>&nbsp; <span class='diff-add'> var values = [];</span>&nbsp; <span class='diff-add'> keys.forEach(function(key) {</span>&nbsp; <span class='diff-add'> values.push(d[key]);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return Promise.all(values).then(function(v) {</span>&nbsp; <span class='diff-add'> d = {};</span>&nbsp; <span class='diff-add'> for(var i=0; i<keys.length; i++) {</span>&nbsp; <span class='diff-add'> d[keys[i]] = v[i];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return d;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var reject = function(message, log) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Creates a wrappable Promise rejection function.</span>&nbsp; <span class='diff-add'> * </span>&nbsp; <span class='diff-add'> * Creates a function that returns a Promise.reject with a new WrappedError</span>&nbsp; <span class='diff-add'> * that has the provided message and wraps the original error that </span>&nbsp; <span class='diff-add'> * caused the promise to reject.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return function(error) { </span>&nbsp; <span class='diff-add'> var wrapped_error = new WrappedError(message, error);</span>&nbsp; <span class='diff-add'> if (log) console.error(wrapped_error); </span>&nbsp; <span class='diff-add'> return Promise.reject(wrapped_error); </span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var typeset = function(element, text) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Apply MathJax rendering to an element, and optionally set its text</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * If MathJax is not available, make no changes.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Returns the output any number of typeset elements, or undefined if</span>&nbsp; <span class='diff-add'> * MathJax was not available.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters</span>&nbsp; <span class='diff-add'> * ----------</span>&nbsp; <span class='diff-add'> * element: Node, NodeList, or jQuery selection</span>&nbsp; <span class='diff-add'> * text: option string</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var $el = element.jquery ? element : $(element);</span>&nbsp; <span class='diff-add'> if(arguments.length > 1){</span>&nbsp; <span class='diff-add'> $el.text(text);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if(!window.MathJax){</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return $el.map(function(){</span>&nbsp; <span class='diff-add'> // MathJax takes a DOM node: $.map makes `this` the context</span>&nbsp; <span class='diff-add'> return MathJax.Hub.Queue(["Typeset", MathJax.Hub, this]);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var time = {};</span>&nbsp; <span class='diff-add'> time.milliseconds = {};</span>&nbsp; <span class='diff-add'> time.milliseconds.s = 1000;</span>&nbsp; <span class='diff-add'> time.milliseconds.m = 60 * time.milliseconds.s;</span>&nbsp; <span class='diff-add'> time.milliseconds.h = 60 * time.milliseconds.m;</span>&nbsp; <span class='diff-add'> time.milliseconds.d = 24 * time.milliseconds.h;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> time.thresholds = {</span>&nbsp; <span class='diff-add'> // moment.js thresholds in milliseconds</span>&nbsp; <span class='diff-add'> s: moment.relativeTimeThreshold('s') * time.milliseconds.s,</span>&nbsp; <span class='diff-add'> m: moment.relativeTimeThreshold('m') * time.milliseconds.m,</span>&nbsp; <span class='diff-add'> h: moment.relativeTimeThreshold('h') * time.milliseconds.h,</span>&nbsp; <span class='diff-add'> d: moment.relativeTimeThreshold('d') * time.milliseconds.d,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> time.timeout_from_dt = function (dt) {</span>&nbsp; <span class='diff-add'> /** compute a timeout based on dt</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> input and output both in milliseconds</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> use moment's relative time thresholds:</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> - 10 seconds if in 'seconds ago' territory</span>&nbsp; <span class='diff-add'> - 1 minute if in 'minutes ago'</span>&nbsp; <span class='diff-add'> - 1 hour otherwise</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (dt < time.thresholds.s) {</span>&nbsp; <span class='diff-add'> return 10 * time.milliseconds.s;</span>&nbsp; <span class='diff-add'> } else if (dt < time.thresholds.m) {</span>&nbsp; <span class='diff-add'> return time.milliseconds.m;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return time.milliseconds.h;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var utils = {</span>&nbsp; <span class='diff-add'> load_extensions: load_extensions,</span>&nbsp; <span class='diff-add'> load_extensions_from_config: load_extensions_from_config,</span>&nbsp; <span class='diff-add'> regex_split : regex_split,</span>&nbsp; <span class='diff-add'> uuid : uuid,</span>&nbsp; <span class='diff-add'> fixConsole : fixConsole,</span>&nbsp; <span class='diff-add'> fixCarriageReturn : fixCarriageReturn,</span>&nbsp; <span class='diff-add'> autoLinkUrls : autoLinkUrls,</span>&nbsp; <span class='diff-add'> points_to_pixels : points_to_pixels,</span>&nbsp; <span class='diff-add'> get_body_data : get_body_data,</span>&nbsp; <span class='diff-add'> parse_url : parse_url,</span>&nbsp; <span class='diff-add'> url_path_split : url_path_split,</span>&nbsp; <span class='diff-add'> url_path_join : url_path_join,</span>&nbsp; <span class='diff-add'> url_join_encode : url_join_encode,</span>&nbsp; <span class='diff-add'> encode_uri_components : encode_uri_components,</span>&nbsp; <span class='diff-add'> splitext : splitext,</span>&nbsp; <span class='diff-add'> escape_html : escape_html,</span>&nbsp; <span class='diff-add'> always_new : always_new,</span>&nbsp; <span class='diff-add'> to_absolute_cursor_pos : to_absolute_cursor_pos,</span>&nbsp; <span class='diff-add'> from_absolute_cursor_pos : from_absolute_cursor_pos,</span>&nbsp; <span class='diff-add'> browser : browser,</span>&nbsp; <span class='diff-add'> platform: platform,</span>&nbsp; <span class='diff-add'> get_url_param: get_url_param,</span>&nbsp; <span class='diff-add'> is_or_has : is_or_has,</span>&nbsp; <span class='diff-add'> is_focused : is_focused,</span>&nbsp; <span class='diff-add'> mergeopt: mergeopt,</span>&nbsp; <span class='diff-add'> ajax_error_msg : ajax_error_msg,</span>&nbsp; <span class='diff-add'> log_ajax_error : log_ajax_error,</span>&nbsp; <span class='diff-add'> requireCodeMirrorMode : requireCodeMirrorMode,</span>&nbsp; <span class='diff-add'> XHR_ERROR : XHR_ERROR,</span>&nbsp; <span class='diff-add'> wrap_ajax_error : wrap_ajax_error,</span>&nbsp; <span class='diff-add'> promising_ajax : promising_ajax,</span>&nbsp; <span class='diff-add'> WrappedError: WrappedError,</span>&nbsp; <span class='diff-add'> load_class: load_class,</span>&nbsp; <span class='diff-add'> resolve_promises_dict: resolve_promises_dict,</span>&nbsp; <span class='diff-add'> reject: reject,</span>&nbsp; <span class='diff-add'> typeset: typeset,</span>&nbsp; <span class='diff-add'> time: time,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // Backwards compatability.</span>&nbsp; <span class='diff-add'> IPython.utils = utils;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> return utils;</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget.js b/ipynb/Array-feature-overlap-05_files/widget.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..e5f758d</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define(["widgets/js/manager",</span>&nbsp; <span class='diff-add'> "underscore",</span>&nbsp; <span class='diff-add'> "backbone",</span>&nbsp; <span class='diff-add'> "jquery",</span>&nbsp; <span class='diff-add'> "base/js/utils",</span>&nbsp; <span class='diff-add'> "base/js/namespace",</span>&nbsp; <span class='diff-add'>], function(widgetmanager, _, Backbone, $, utils, IPython){</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var WidgetModel = Backbone.Model.extend({</span>&nbsp; <span class='diff-add'> constructor: function (widget_manager, model_id, comm) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Constructor</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Creates a WidgetModel instance.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters</span>&nbsp; <span class='diff-add'> * ----------</span>&nbsp; <span class='diff-add'> * widget_manager : WidgetManager instance</span>&nbsp; <span class='diff-add'> * model_id : string</span>&nbsp; <span class='diff-add'> * An ID unique to this model.</span>&nbsp; <span class='diff-add'> * comm : Comm instance (optional)</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.widget_manager = widget_manager;</span>&nbsp; <span class='diff-add'> this.state_change = Promise.resolve();</span>&nbsp; <span class='diff-add'> this._buffered_state_diff = {};</span>&nbsp; <span class='diff-add'> this.pending_msgs = 0;</span>&nbsp; <span class='diff-add'> this.msg_buffer = null;</span>&nbsp; <span class='diff-add'> this.state_lock = null;</span>&nbsp; <span class='diff-add'> this.id = model_id;</span>&nbsp; <span class='diff-add'> this.views = {};</span>&nbsp; <span class='diff-add'> this._resolve_received_state = {};</span>&nbsp; <span class='diff-add'> if (comm !== undefined) {</span>&nbsp; <span class='diff-add'> // Remember comm associated with the model.</span>&nbsp; <span class='diff-add'> this.comm = comm;</span>&nbsp; <span class='diff-add'> comm.model = this;</span>&nbsp; <span class='diff-add'> // Hook comm messages up to model.</span>&nbsp; <span class='diff-add'> comm.on_close($.proxy(this._handle_comm_closed, this));</span>&nbsp; <span class='diff-add'> comm.on_msg($.proxy(this._handle_comm_msg, this));</span>&nbsp; <span class='diff-add'> // Assume the comm is alive.</span>&nbsp; <span class='diff-add'> this.set_comm_live(true);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.set_comm_live(false);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Listen for the events that lead to the websocket being terminated.</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var died = function() {</span>&nbsp; <span class='diff-add'> that.set_comm_live(false);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> widget_manager.notebook.events.on('kernel_disconnected.Kernel', died);</span>&nbsp; <span class='diff-add'> widget_manager.notebook.events.on('kernel_killed.Kernel', died);</span>&nbsp; <span class='diff-add'> widget_manager.notebook.events.on('kernel_restarting.Kernel', died);</span>&nbsp; <span class='diff-add'> widget_manager.notebook.events.on('kernel_dead.Kernel', died);</span>&nbsp; <span class='diff-add'> return Backbone.Model.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> send: function (content, callbacks) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Send a custom msg over the comm.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this.comm !== undefined) {</span>&nbsp; <span class='diff-add'> var data = {method: 'custom', content: content};</span>&nbsp; <span class='diff-add'> this.comm.send(data, callbacks);</span>&nbsp; <span class='diff-add'> this.pending_msgs++;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> request_state: function(callbacks) {</span>&nbsp; <span class='diff-add'> /** </span>&nbsp; <span class='diff-add'> * Request a state push from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (!this.comm) {</span>&nbsp; <span class='diff-add'> console.error("Could not request_state because comm doesn't exist!");</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var msg_id = this.comm.send({method: 'request_state'}, callbacks || this.widget_manager.callbacks());</span>&nbsp; <span class='diff-add'> // Promise that is resolved when a state is received</span>&nbsp; <span class='diff-add'> // from the back-end.</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var received_state = new Promise(function(resolve) {</span>&nbsp; <span class='diff-add'> that._resolve_received_state[msg_id] = resolve;</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return received_state;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> set_comm_live: function(live) {</span>&nbsp; <span class='diff-add'> /** </span>&nbsp; <span class='diff-add'> * Change the comm_live state of the model.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this.comm_live === undefined || this.comm_live != live) {</span>&nbsp; <span class='diff-add'> this.comm_live = live;</span>&nbsp; <span class='diff-add'> this.trigger(live ? 'comm:live' : 'comm:dead', {model: this});</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> close: function(comm_closed) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Close model</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this.comm && !comm_closed) {</span>&nbsp; <span class='diff-add'> this.comm.close();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.stopListening();</span>&nbsp; <span class='diff-add'> this.trigger('destroy', this);</span>&nbsp; <span class='diff-add'> delete this.comm.model; // Delete ref so GC will collect widget model.</span>&nbsp; <span class='diff-add'> delete this.comm;</span>&nbsp; <span class='diff-add'> delete this.model_id; // Delete id from model so widget manager cleans up.</span>&nbsp; <span class='diff-add'> _.each(this.views, function(v, id, views) {</span>&nbsp; <span class='diff-add'> v.then(function(view) {</span>&nbsp; <span class='diff-add'> view.remove();</span>&nbsp; <span class='diff-add'> delete views[id];</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _handle_comm_closed: function (msg) {</span>&nbsp; <span class='diff-add'> /** </span>&nbsp; <span class='diff-add'> * Handle when a widget is closed.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.trigger('comm:close');</span>&nbsp; <span class='diff-add'> this.close(true);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _handle_comm_msg: function (msg) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle incoming comm msg.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var method = msg.content.data.method;</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> switch (method) {</span>&nbsp; <span class='diff-add'> case 'update':</span>&nbsp; <span class='diff-add'> this.state_change = this.state_change</span>&nbsp; <span class='diff-add'> .then(function() {</span>&nbsp; <span class='diff-add'> return that.set_state(msg.content.data.state);</span>&nbsp; <span class='diff-add'> }).catch(utils.reject("Couldn't process update msg for model id '" + String(that.id) + "'", true))</span>&nbsp; <span class='diff-add'> .then(function() {</span>&nbsp; <span class='diff-add'> var parent_id = msg.parent_header.msg_id;</span>&nbsp; <span class='diff-add'> if (that._resolve_received_state[parent_id] !== undefined) {</span>&nbsp; <span class='diff-add'> that._resolve_received_state[parent_id].call();</span>&nbsp; <span class='diff-add'> delete that._resolve_received_state[parent_id];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }).catch(utils.reject("Couldn't resolve state request promise", true));</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'custom':</span>&nbsp; <span class='diff-add'> this.trigger('msg:custom', msg.content.data.content);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'display':</span>&nbsp; <span class='diff-add'> this.state_change = this.state_change.then(function() {</span>&nbsp; <span class='diff-add'> that.widget_manager.display_view(msg, that);</span>&nbsp; <span class='diff-add'> }).catch(utils.reject('Could not process display view msg', true));</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> set_state: function (state) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> // Handle when a widget is updated via the python side.</span>&nbsp; <span class='diff-add'> return this._unpack_models(state).then(function(state) {</span>&nbsp; <span class='diff-add'> that.state_lock = state;</span>&nbsp; <span class='diff-add'> try {</span>&nbsp; <span class='diff-add'> WidgetModel.__super__.set.call(that, state);</span>&nbsp; <span class='diff-add'> } finally {</span>&nbsp; <span class='diff-add'> that.state_lock = null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }).catch(utils.reject("Couldn't set model state", true));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> get_state: function() {</span>&nbsp; <span class='diff-add'> // Get the serializable state of the model.</span>&nbsp; <span class='diff-add'> var state = this.toJSON();</span>&nbsp; <span class='diff-add'> for (var key in state) {</span>&nbsp; <span class='diff-add'> if (state.hasOwnProperty(key)) {</span>&nbsp; <span class='diff-add'> state[key] = this._pack_models(state[key]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return state;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _handle_status: function (msg, callbacks) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle status msgs.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * execution_state : ('busy', 'idle', 'starting')</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this.comm !== undefined) {</span>&nbsp; <span class='diff-add'> if (msg.content.execution_state ==='idle') {</span>&nbsp; <span class='diff-add'> // Send buffer if this message caused another message to be</span>&nbsp; <span class='diff-add'> // throttled.</span>&nbsp; <span class='diff-add'> if (this.msg_buffer !== null &&</span>&nbsp; <span class='diff-add'> (this.get('msg_throttle') || 3) === this.pending_msgs) {</span>&nbsp; <span class='diff-add'> var data = {method: 'backbone', sync_method: 'update', sync_data: this.msg_buffer};</span>&nbsp; <span class='diff-add'> this.comm.send(data, callbacks);</span>&nbsp; <span class='diff-add'> this.msg_buffer = null;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> --this.pending_msgs;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> callbacks: function(view) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Create msg callbacks for a comm msg.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var callbacks = this.widget_manager.callbacks(view);</span>&nbsp; <span class='diff-add'> if (callbacks.iopub === undefined) {</span>&nbsp; <span class='diff-add'> callbacks.iopub = {};</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> callbacks.iopub.status = function (msg) {</span>&nbsp; <span class='diff-add'> that._handle_status(msg, callbacks);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> return callbacks;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> set: function(key, val, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a value.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var return_value = WidgetModel.__super__.set.apply(this, arguments);</span>&nbsp; <span class='diff-add'> // Backbone only remembers the diff of the most recent set()</span>&nbsp; <span class='diff-add'> // operation. Calling set multiple times in a row results in a </span>&nbsp; <span class='diff-add'> // loss of diff information. Here we keep our own running diff.</span>&nbsp; <span class='diff-add'> this._buffered_state_diff = $.extend(this._buffered_state_diff, this.changedAttributes() || {});</span>&nbsp; <span class='diff-add'> return return_value;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> sync: function (method, model, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle sync to the back-end. Called when a model.save() is called.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Make sure a comm exists.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var error = options.error || function() {</span>&nbsp; <span class='diff-add'> console.error('Backbone sync error:', arguments);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> if (this.comm === undefined) {</span>&nbsp; <span class='diff-add'> error();</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Delete any key value pairs that the back-end already knows about.</span>&nbsp; <span class='diff-add'> var attrs = (method === 'patch') ? options.attrs : model.toJSON(options);</span>&nbsp; <span class='diff-add'> if (this.state_lock !== null) {</span>&nbsp; <span class='diff-add'> var keys = Object.keys(this.state_lock);</span>&nbsp; <span class='diff-add'> for (var i=0; i<keys.length; i++) {</span>&nbsp; <span class='diff-add'> var key = keys[i];</span>&nbsp; <span class='diff-add'> if (attrs[key] === this.state_lock[key]) {</span>&nbsp; <span class='diff-add'> delete attrs[key];</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Only sync if there are attributes to send to the back-end.</span>&nbsp; <span class='diff-add'> attrs = this._pack_models(attrs);</span>&nbsp; <span class='diff-add'> if (_.size(attrs) > 0) {</span>&nbsp; <span class='diff-add'> // If this message was sent via backbone itself, it will not</span>&nbsp; <span class='diff-add'> // have any callbacks. It's important that we create callbacks</span>&nbsp; <span class='diff-add'> // so we can listen for status messages, etc...</span>&nbsp; <span class='diff-add'> var callbacks = options.callbacks || this.callbacks();</span>&nbsp; <span class='diff-add'> // Check throttle.</span>&nbsp; <span class='diff-add'> if (this.pending_msgs >= (this.get('msg_throttle') || 3)) {</span>&nbsp; <span class='diff-add'> // The throttle has been exceeded, buffer the current msg so</span>&nbsp; <span class='diff-add'> // it can be sent once the kernel has finished processing </span>&nbsp; <span class='diff-add'> // some of the existing messages.</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Combine updates if it is a 'patch' sync, otherwise replace updates</span>&nbsp; <span class='diff-add'> switch (method) {</span>&nbsp; <span class='diff-add'> case 'patch':</span>&nbsp; <span class='diff-add'> this.msg_buffer = $.extend(this.msg_buffer || {}, attrs);</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> case 'update':</span>&nbsp; <span class='diff-add'> case 'create':</span>&nbsp; <span class='diff-add'> this.msg_buffer = attrs;</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> default:</span>&nbsp; <span class='diff-add'> error();</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.msg_buffer_callbacks = callbacks;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // We haven't exceeded the throttle, send the message like </span>&nbsp; <span class='diff-add'> // normal.</span>&nbsp; <span class='diff-add'> var data = {method: 'backbone', sync_data: attrs};</span>&nbsp; <span class='diff-add'> this.comm.send(data, callbacks);</span>&nbsp; <span class='diff-add'> this.pending_msgs++;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Since the comm is a one-way communication, assume the message </span>&nbsp; <span class='diff-add'> // arrived. Don't call success since we don't have a model back from the server</span>&nbsp; <span class='diff-add'> // this means we miss out on the 'sync' event.</span>&nbsp; <span class='diff-add'> this._buffered_state_diff = {};</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> save_changes: function(callbacks) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Push this model's state to the back-end</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * This invokes a Backbone.Sync.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.save(this._buffered_state_diff, {patch: true, callbacks: callbacks});</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _pack_models: function(value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Replace models with model ids recursively.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var packed;</span>&nbsp; <span class='diff-add'> if (value instanceof Backbone.Model) {</span>&nbsp; <span class='diff-add'> return "IPY_MODEL_" + value.id;</span>&nbsp; <span class='diff-add'> } else if ($.isArray(value)) {</span>&nbsp; <span class='diff-add'> packed = [];</span>&nbsp; <span class='diff-add'> _.each(value, function(sub_value, key) {</span>&nbsp; <span class='diff-add'> packed.push(that._pack_models(sub_value));</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return packed;</span>&nbsp; <span class='diff-add'> } else if (value instanceof Date || value instanceof String) {</span>&nbsp; <span class='diff-add'> return value;</span>&nbsp; <span class='diff-add'> } else if (value instanceof Object) {</span>&nbsp; <span class='diff-add'> packed = {};</span>&nbsp; <span class='diff-add'> _.each(value, function(sub_value, key) {</span>&nbsp; <span class='diff-add'> packed[key] = that._pack_models(sub_value);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return packed;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return value;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _unpack_models: function(value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Replace model ids with models recursively.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var unpacked;</span>&nbsp; <span class='diff-add'> if ($.isArray(value)) {</span>&nbsp; <span class='diff-add'> unpacked = [];</span>&nbsp; <span class='diff-add'> _.each(value, function(sub_value, key) {</span>&nbsp; <span class='diff-add'> unpacked.push(that._unpack_models(sub_value));</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return Promise.all(unpacked);</span>&nbsp; <span class='diff-add'> } else if (value instanceof Object) {</span>&nbsp; <span class='diff-add'> unpacked = {};</span>&nbsp; <span class='diff-add'> _.each(value, function(sub_value, key) {</span>&nbsp; <span class='diff-add'> unpacked[key] = that._unpack_models(sub_value);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return utils.resolve_promises_dict(unpacked);</span>&nbsp; <span class='diff-add'> } else if (typeof value === 'string' && value.slice(0,10) === "IPY_MODEL_") {</span>&nbsp; <span class='diff-add'> // get_model returns a promise already</span>&nbsp; <span class='diff-add'> return this.widget_manager.get_model(value.slice(10, value.length));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return Promise.resolve(value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> on_some_change: function(keys, callback, context) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * on_some_change(["key1", "key2"], foo, context) differs from</span>&nbsp; <span class='diff-add'> * on("change:key1 change:key2", foo, context).</span>&nbsp; <span class='diff-add'> * If the widget attributes key1 and key2 are both modified, </span>&nbsp; <span class='diff-add'> * the second form will result in foo being called twice</span>&nbsp; <span class='diff-add'> * while the first will call foo only once.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.on('change', function() {</span>&nbsp; <span class='diff-add'> if (keys.some(this.hasChanged, this)) {</span>&nbsp; <span class='diff-add'> callback.apply(context);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> widgetmanager.WidgetManager.register_widget_model('WidgetModel', WidgetModel);</span>&nbsp; <span class='diff-add'> var WidgetView = Backbone.View.extend({</span>&nbsp; <span class='diff-add'> initialize: function(parameters) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Public constructor.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.model.on('change',this.update,this);</span>&nbsp; <span class='diff-add'> // Bubble the comm live events.</span>&nbsp; <span class='diff-add'> this.model.on('comm:live', function() {</span>&nbsp; <span class='diff-add'> this.trigger('comm:live', this);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.model.on('comm:dead', function() {</span>&nbsp; <span class='diff-add'> this.trigger('comm:dead', this);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.options = parameters.options;</span>&nbsp; <span class='diff-add'> this.on('displayed', function() { </span>&nbsp; <span class='diff-add'> this.is_displayed = true; </span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Triggered on model change.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Update view to be consistent with this.model</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> create_child_view: function(child_model, options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Create and promise that resolves to a child view of a given model</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> options = $.extend({ parent: this }, options || {});</span>&nbsp; <span class='diff-add'> return this.model.widget_manager.create_view(child_model, options).catch(utils.reject("Couldn't create child view"), true);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> callbacks: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Create msg callbacks for a comm msg.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return this.model.callbacks(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> render: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Render the view.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * By default, this is only called the first time the view is created</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> send: function (content) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Send a custom msg associated with this view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.model.send(content, this.callbacks());</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> touch: function () {</span>&nbsp; <span class='diff-add'> this.model.save_changes(this.callbacks());</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> after_displayed: function (callback, context) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Calls the callback right away is the view is already displayed</span>&nbsp; <span class='diff-add'> * otherwise, register the callback to the 'displayed' event.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this.is_displayed) {</span>&nbsp; <span class='diff-add'> callback.apply(context);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.on('displayed', callback, context);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> remove: function () {</span>&nbsp; <span class='diff-add'> // Raise a remove event when the view is removed.</span>&nbsp; <span class='diff-add'> WidgetView.__super__.remove.apply(this, arguments);</span>&nbsp; <span class='diff-add'> this.trigger('remove');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var DOMWidgetView = WidgetView.extend({</span>&nbsp; <span class='diff-add'> initialize: function (parameters) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Public constructor</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> DOMWidgetView.__super__.initialize.apply(this, [parameters]);</span>&nbsp; <span class='diff-add'> this.model.on('change:visible', this.update_visible, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:_css', this.update_css, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:_dom_classes', function(model, new_classes) {</span>&nbsp; <span class='diff-add'> var old_classes = model.previous('_dom_classes');</span>&nbsp; <span class='diff-add'> this.update_classes(old_classes, new_classes);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:color', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('color', value); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:background_color', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('background', value); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:width', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('width', value); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:height', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('height', value); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:border_color', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('border-color', value); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:border_width', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('border-width', value); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:border_style', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('border-style', value); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:font_style', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('font-style', value); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:font_weight', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('font-weight', value); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:font_size', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('font-size', this._default_px(value)); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:font_family', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('font-family', value); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:padding', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('padding', value); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:margin', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('margin', this._default_px(value)); }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:border_radius', function (model, value) { </span>&nbsp; <span class='diff-add'> this.update_attr('border-radius', this._default_px(value)); }, this);</span>&nbsp; <span class='diff-add'> this.after_displayed(function() {</span>&nbsp; <span class='diff-add'> this.update_visible(this.model, this.model.get("visible"));</span>&nbsp; <span class='diff-add'> this.update_classes([], this.model.get('_dom_classes'));</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.update_attr('color', this.model.get('color'));</span>&nbsp; <span class='diff-add'> this.update_attr('background', this.model.get('background_color'));</span>&nbsp; <span class='diff-add'> this.update_attr('width', this.model.get('width'));</span>&nbsp; <span class='diff-add'> this.update_attr('height', this.model.get('height'));</span>&nbsp; <span class='diff-add'> this.update_attr('border-color', this.model.get('border_color'));</span>&nbsp; <span class='diff-add'> this.update_attr('border-width', this.model.get('border_width'));</span>&nbsp; <span class='diff-add'> this.update_attr('border-style', this.model.get('border_style'));</span>&nbsp; <span class='diff-add'> this.update_attr('font-style', this.model.get('font_style'));</span>&nbsp; <span class='diff-add'> this.update_attr('font-weight', this.model.get('font_weight'));</span>&nbsp; <span class='diff-add'> this.update_attr('font-size', this._default_px(this.model.get('font_size')));</span>&nbsp; <span class='diff-add'> this.update_attr('font-family', this.model.get('font_family'));</span>&nbsp; <span class='diff-add'> this.update_attr('padding', this.model.get('padding'));</span>&nbsp; <span class='diff-add'> this.update_attr('margin', this._default_px(this.model.get('margin')));</span>&nbsp; <span class='diff-add'> this.update_attr('border-radius', this._default_px(this.model.get('border_radius')));</span>&nbsp; <span class='diff-add'> this.update_css(this.model, this.model.get("_css"));</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _default_px: function(value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Makes browser interpret a numerical string as a pixel value.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (/^\d+\.?(\d+)?$/.test(value.trim())) {</span>&nbsp; <span class='diff-add'> return value.trim() + 'px';</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return value;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_visible: function(model, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update visibility</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> switch(value) {</span>&nbsp; <span class='diff-add'> case null: // python None</span>&nbsp; <span class='diff-add'> this.$el.show().css('visibility', 'hidden'); break;</span>&nbsp; <span class='diff-add'> case false:</span>&nbsp; <span class='diff-add'> this.$el.hide(); break;</span>&nbsp; <span class='diff-add'> case true:</span>&nbsp; <span class='diff-add'> this.$el.show().css('visibility', ''); break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_css: function (model, css) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the css styling of this view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (css === undefined) {return;}</span>&nbsp; <span class='diff-add'> for (var i = 0; i < css.length; i++) {</span>&nbsp; <span class='diff-add'> // Apply the css traits to all elements that match the selector.</span>&nbsp; <span class='diff-add'> var selector = css[i][0];</span>&nbsp; <span class='diff-add'> var elements = this._get_selector_element(selector);</span>&nbsp; <span class='diff-add'> if (elements.length > 0) {</span>&nbsp; <span class='diff-add'> var trait_key = css[i][1];</span>&nbsp; <span class='diff-add'> var trait_value = css[i][2];</span>&nbsp; <span class='diff-add'> elements.css(trait_key ,trait_value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_classes: function (old_classes, new_classes, $el) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the DOM classes applied to an element, default to this.$el.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if ($el===undefined) {</span>&nbsp; <span class='diff-add'> $el = this.$el;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> _.difference(old_classes, new_classes).map(function(c) {$el.removeClass(c);})</span>&nbsp; <span class='diff-add'> _.difference(new_classes, old_classes).map(function(c) {$el.addClass(c);})</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_mapped_classes: function(class_map, trait_name, previous_trait_value, $el) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the DOM classes applied to the widget based on a single</span>&nbsp; <span class='diff-add'> * trait's value.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Given a trait value classes map, this function automatically</span>&nbsp; <span class='diff-add'> * handles applying the appropriate classes to the widget element</span>&nbsp; <span class='diff-add'> * and removing classes that are no longer valid.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Parameters</span>&nbsp; <span class='diff-add'> * ----------</span>&nbsp; <span class='diff-add'> * class_map: dictionary</span>&nbsp; <span class='diff-add'> * Dictionary of trait values to class lists.</span>&nbsp; <span class='diff-add'> * Example:</span>&nbsp; <span class='diff-add'> * {</span>&nbsp; <span class='diff-add'> * success: ['alert', 'alert-success'],</span>&nbsp; <span class='diff-add'> * info: ['alert', 'alert-info'],</span>&nbsp; <span class='diff-add'> * warning: ['alert', 'alert-warning'],</span>&nbsp; <span class='diff-add'> * danger: ['alert', 'alert-danger']</span>&nbsp; <span class='diff-add'> * };</span>&nbsp; <span class='diff-add'> * trait_name: string</span>&nbsp; <span class='diff-add'> * Name of the trait to check the value of.</span>&nbsp; <span class='diff-add'> * previous_trait_value: optional string, default ''</span>&nbsp; <span class='diff-add'> * Last trait value</span>&nbsp; <span class='diff-add'> * $el: optional jQuery element handle, defaults to this.$el</span>&nbsp; <span class='diff-add'> * Element that the classes are applied to.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var key = previous_trait_value;</span>&nbsp; <span class='diff-add'> if (key === undefined) {</span>&nbsp; <span class='diff-add'> key = this.model.previous(trait_name);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var old_classes = class_map[key] ? class_map[key] : [];</span>&nbsp; <span class='diff-add'> key = this.model.get(trait_name);</span>&nbsp; <span class='diff-add'> var new_classes = class_map[key] ? class_map[key] : [];</span>&nbsp; <span class='diff-add'> this.update_classes(old_classes, new_classes, $el || this.$el);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> _get_selector_element: function (selector) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Get the elements via the css selector.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var elements;</span>&nbsp; <span class='diff-add'> if (!selector) {</span>&nbsp; <span class='diff-add'> elements = this.$el;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> elements = this.$el.find(selector).addBack(selector);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return elements;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> typeset: function(element, text){</span>&nbsp; <span class='diff-add'> utils.typeset.apply(null, arguments);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var ViewList = function(create_view, remove_view, context) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * - create_view and remove_view are default functions called when adding or removing views</span>&nbsp; <span class='diff-add'> * - create_view takes a model and returns a view or a promise for a view for that model</span>&nbsp; <span class='diff-add'> * - remove_view takes a view and destroys it (including calling `view.remove()`)</span>&nbsp; <span class='diff-add'> * - each time the update() function is called with a new list, the create and remove</span>&nbsp; <span class='diff-add'> * callbacks will be called in an order so that if you append the views created in the</span>&nbsp; <span class='diff-add'> * create callback and remove the views in the remove callback, you will duplicate </span>&nbsp; <span class='diff-add'> * the order of the list.</span>&nbsp; <span class='diff-add'> * - the remove callback defaults to just removing the view (e.g., pass in null for the second parameter)</span>&nbsp; <span class='diff-add'> * - the context defaults to the created ViewList. If you pass another context, the create and remove</span>&nbsp; <span class='diff-add'> * will be called in that context.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.initialize.apply(this, arguments);</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> _.extend(ViewList.prototype, {</span>&nbsp; <span class='diff-add'> initialize: function(create_view, remove_view, context) {</span>&nbsp; <span class='diff-add'> this._handler_context = context || this;</span>&nbsp; <span class='diff-add'> this._models = [];</span>&nbsp; <span class='diff-add'> this.views = []; // list of promises for views</span>&nbsp; <span class='diff-add'> this._create_view = create_view;</span>&nbsp; <span class='diff-add'> this._remove_view = remove_view || function(view) {view.remove();};</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update: function(new_models, create_view, remove_view, context) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * the create_view, remove_view, and context arguments override the defaults</span>&nbsp; <span class='diff-add'> * specified when the list is created.</span>&nbsp; <span class='diff-add'> * after this function, the .views attribute is a list of promises for views</span>&nbsp; <span class='diff-add'> * if you want to perform some action on the list of views, do something like</span>&nbsp; <span class='diff-add'> * `Promise.all(myviewlist.views).then(function(views) {...});`</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var remove = remove_view || this._remove_view;</span>&nbsp; <span class='diff-add'> var create = create_view || this._create_view;</span>&nbsp; <span class='diff-add'> context = context || this._handler_context;</span>&nbsp; <span class='diff-add'> var i = 0;</span>&nbsp; <span class='diff-add'> // first, skip past the beginning of the lists if they are identical</span>&nbsp; <span class='diff-add'> for (; i < new_models.length; i++) {</span>&nbsp; <span class='diff-add'> if (i >= this._models.length || new_models[i] !== this._models[i]) {</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var first_removed = i;</span>&nbsp; <span class='diff-add'> // Remove the non-matching items from the old list.</span>&nbsp; <span class='diff-add'> var removed = this.views.splice(first_removed, this.views.length-first_removed);</span>&nbsp; <span class='diff-add'> for (var j = 0; j < removed.length; j++) {</span>&nbsp; <span class='diff-add'> removed[j].then(function(view) {</span>&nbsp; <span class='diff-add'> remove.call(context, view)</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Add the rest of the new list items.</span>&nbsp; <span class='diff-add'> for (; i < new_models.length; i++) {</span>&nbsp; <span class='diff-add'> this.views.push(Promise.resolve(create.call(context, new_models[i])));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // make a copy of the input array</span>&nbsp; <span class='diff-add'> this._models = new_models.slice();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> remove: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * removes every view in the list; convenience function for `.update([])`</span>&nbsp; <span class='diff-add'> * that should be faster</span>&nbsp; <span class='diff-add'> * returns a promise that resolves after this removal is done</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> return Promise.all(this.views).then(function(views) {</span>&nbsp; <span class='diff-add'> for (var i = 0; i < that.views.length; i++) {</span>&nbsp; <span class='diff-add'> that._remove_view.call(that._handler_context, views[i]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> that.views = [];</span>&nbsp; <span class='diff-add'> that._models = [];</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var widget = {</span>&nbsp; <span class='diff-add'> 'WidgetModel': WidgetModel,</span>&nbsp; <span class='diff-add'> 'WidgetView': WidgetView,</span>&nbsp; <span class='diff-add'> 'DOMWidgetView': DOMWidgetView,</span>&nbsp; <span class='diff-add'> 'ViewList': ViewList,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> // For backwards compatability.</span>&nbsp; <span class='diff-add'> $.extend(IPython, widget);</span>&nbsp; <span class='diff-add'> return widget;</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_bool.js b/ipynb/Array-feature-overlap-05_files/widget_bool.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..0234054</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_bool.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/widget",</span>&nbsp; <span class='diff-add'> "jquery",</span>&nbsp; <span class='diff-add'> "bootstrap",</span>&nbsp; <span class='diff-add'>], function(widget, $){</span>&nbsp; <span class='diff-add'> var CheckboxView = widget.DOMWidgetView.extend({</span>&nbsp; <span class='diff-add'> render : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .addClass('widget-hbox widget-checkbox');</span>&nbsp; <span class='diff-add'> this.$label = $('<div />')</span>&nbsp; <span class='diff-add'> .addClass('widget-label')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> this.$checkbox = $('<input />')</span>&nbsp; <span class='diff-add'> .attr('type', 'checkbox')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .click($.proxy(this.handle_click, this));</span>&nbsp; <span class='diff-add'> this.update(); // Set defaults.</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$checkbox.css(name, value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> handle_click: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handles when the checkbox is clicked.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> * model to update.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var value = this.model.get('value');</span>&nbsp; <span class='diff-add'> this.model.set('value', ! value, {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(options){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$checkbox.prop('checked', this.model.get('value'));</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> var disabled = this.model.get('disabled');</span>&nbsp; <span class='diff-add'> this.$checkbox.prop('disabled', disabled);</span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> if (description.trim().length === 0) {</span>&nbsp; <span class='diff-add'> this.$label.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.typeset(this.$label, description);</span>&nbsp; <span class='diff-add'> this.$label.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return CheckboxView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var ToggleButtonView = widget.DOMWidgetView.extend({</span>&nbsp; <span class='diff-add'> render : function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.setElement($('<button />')</span>&nbsp; <span class='diff-add'> .addClass('btn btn-default')</span>&nbsp; <span class='diff-add'> .attr('type', 'button')</span>&nbsp; <span class='diff-add'> .on('click', function (e) {</span>&nbsp; <span class='diff-add'> e.preventDefault();</span>&nbsp; <span class='diff-add'> that.handle_click();</span>&nbsp; <span class='diff-add'> }));</span>&nbsp; <span class='diff-add'> this.$el.attr("data-toggle", "tooltip");</span>&nbsp; <span class='diff-add'> this.model.on('change:button_style', function(model, value) {</span>&nbsp; <span class='diff-add'> this.update_button_style();</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.update_button_style('');</span>&nbsp; <span class='diff-add'> this.update(); // Set defaults.</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_button_style: function(previous_trait_value) {</span>&nbsp; <span class='diff-add'> var class_map = {</span>&nbsp; <span class='diff-add'> primary: ['btn-primary'],</span>&nbsp; <span class='diff-add'> success: ['btn-success'],</span>&nbsp; <span class='diff-add'> info: ['btn-info'],</span>&nbsp; <span class='diff-add'> warning: ['btn-warning'],</span>&nbsp; <span class='diff-add'> danger: ['btn-danger']</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.update_mapped_classes(class_map, 'button_style', previous_trait_value);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(options){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (this.model.get('value')) {</span>&nbsp; <span class='diff-add'> this.$el.addClass('active');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$el.removeClass('active');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> var disabled = this.model.get('disabled');</span>&nbsp; <span class='diff-add'> this.$el.prop('disabled', disabled);</span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> this.$el.attr("title", this.model.get("tooltip"));</span>&nbsp; <span class='diff-add'> if (description.trim().length === 0) {</span>&nbsp; <span class='diff-add'> this.$el.html("&nbsp;"); // Preserve button height</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$el.text(description);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return ToggleButtonView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> handle_click: function(e) { </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handles and validates user input.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> * model to update.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var value = this.model.get('value');</span>&nbsp; <span class='diff-add'> this.model.set('value', ! value, {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'CheckboxView': CheckboxView,</span>&nbsp; <span class='diff-add'> 'ToggleButtonView': ToggleButtonView,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_box.js b/ipynb/Array-feature-overlap-05_files/widget_box.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..247eb5d</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_box.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/widget",</span>&nbsp; <span class='diff-add'> "jqueryui",</span>&nbsp; <span class='diff-add'> "base/js/utils",</span>&nbsp; <span class='diff-add'> "bootstrap",</span>&nbsp; <span class='diff-add'>], function(widget, $, utils){</span>&nbsp; <span class='diff-add'> "use strict";</span>&nbsp; <span class='diff-add'> var BoxView = widget.DOMWidgetView.extend({</span>&nbsp; <span class='diff-add'> initialize: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Public constructor</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> BoxView.__super__.initialize.apply(this, arguments);</span>&nbsp; <span class='diff-add'> this.children_views = new widget.ViewList(this.add_child_model, null, this);</span>&nbsp; <span class='diff-add'> this.listenTo(this.model, 'change:children', function(model, value) {</span>&nbsp; <span class='diff-add'> this.children_views.update(value);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.listenTo(this.model, 'change:overflow_x', function(model, value) {</span>&nbsp; <span class='diff-add'> this.update_overflow_x();</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.listenTo(this.model, 'change:overflow_y', function(model, value) {</span>&nbsp; <span class='diff-add'> this.update_overflow_y();</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.listenTo(this.model, 'change:box_style', function(model, value) {</span>&nbsp; <span class='diff-add'> this.update_box_style();</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$box.css(name, value);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> render: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$box = this.$el;</span>&nbsp; <span class='diff-add'> this.$box.addClass('widget-box');</span>&nbsp; <span class='diff-add'> this.children_views.update(this.model.get('children'));</span>&nbsp; <span class='diff-add'> this.update_overflow_x();</span>&nbsp; <span class='diff-add'> this.update_overflow_y();</span>&nbsp; <span class='diff-add'> this.update_box_style('');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_overflow_x: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when the x-axis overflow setting is changed.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$box.css('overflow-x', this.model.get('overflow_x'));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_overflow_y: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when the y-axis overflow setting is changed.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$box.css('overflow-y', this.model.get('overflow_y'));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_box_style: function(previous_trait_value) {</span>&nbsp; <span class='diff-add'> var class_map = {</span>&nbsp; <span class='diff-add'> success: ['alert', 'alert-success'],</span>&nbsp; <span class='diff-add'> info: ['alert', 'alert-info'],</span>&nbsp; <span class='diff-add'> warning: ['alert', 'alert-warning'],</span>&nbsp; <span class='diff-add'> danger: ['alert', 'alert-danger']</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.update_mapped_classes(class_map, 'box_style', previous_trait_value, this.$box);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> add_child_model: function(model) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when a model is added to the children list.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var dummy = $('<div/>');</span>&nbsp; <span class='diff-add'> that.$box.append(dummy);</span>&nbsp; <span class='diff-add'> return this.create_child_view(model).then(function(view) {</span>&nbsp; <span class='diff-add'> dummy.replaceWith(view.el);</span>&nbsp; <span class='diff-add'> // Trigger the displayed event of the child view.</span>&nbsp; <span class='diff-add'> that.after_displayed(function() {</span>&nbsp; <span class='diff-add'> view.trigger('displayed');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return view;</span>&nbsp; <span class='diff-add'> }).catch(utils.reject("Couldn't add child view to box", true));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> remove: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * We remove this widget before removing the children as an optimization</span>&nbsp; <span class='diff-add'> * we want to remove the entire container from the DOM first before</span>&nbsp; <span class='diff-add'> * removing each individual child separately.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> BoxView.__super__.remove.apply(this, arguments);</span>&nbsp; <span class='diff-add'> this.children_views.remove();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var FlexBoxView = BoxView.extend({</span>&nbsp; <span class='diff-add'> render: function(){</span>&nbsp; <span class='diff-add'> FlexBoxView.__super__.render.apply(this);</span>&nbsp; <span class='diff-add'> this.listenTo(this.model, 'change:orientation', this.update_orientation, this);</span>&nbsp; <span class='diff-add'> this.listenTo(this.model, 'change:flex', this._flex_changed, this);</span>&nbsp; <span class='diff-add'> this.listenTo(this.model, 'change:pack', this._pack_changed, this);</span>&nbsp; <span class='diff-add'> this.listenTo(this.model, 'change:align', this._align_changed, this);</span>&nbsp; <span class='diff-add'> this._flex_changed();</span>&nbsp; <span class='diff-add'> this._pack_changed();</span>&nbsp; <span class='diff-add'> this._align_changed();</span>&nbsp; <span class='diff-add'> this.update_orientation();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_orientation: function(){</span>&nbsp; <span class='diff-add'> var orientation = this.model.get("orientation");</span>&nbsp; <span class='diff-add'> if (orientation == "vertical") {</span>&nbsp; <span class='diff-add'> this.$box.removeClass("hbox").addClass("vbox");</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$box.removeClass("vbox").addClass("hbox");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _flex_changed: function(){</span>&nbsp; <span class='diff-add'> if (this.model.previous('flex')) {</span>&nbsp; <span class='diff-add'> this.$box.removeClass('box-flex' + this.model.previous('flex'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.$box.addClass('box-flex' + this.model.get('flex'));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _pack_changed: function(){</span>&nbsp; <span class='diff-add'> if (this.model.previous('pack')) {</span>&nbsp; <span class='diff-add'> this.$box.removeClass(this.model.previous('pack'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.$box.addClass(this.model.get('pack'));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _align_changed: function(){</span>&nbsp; <span class='diff-add'> if (this.model.previous('align')) {</span>&nbsp; <span class='diff-add'> this.$box.removeClass('align-' + this.model.previous('align'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.$box.addClass('align-' + this.model.get('align'));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'BoxView': BoxView,</span>&nbsp; <span class='diff-add'> 'FlexBoxView': FlexBoxView,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_button.js b/ipynb/Array-feature-overlap-05_files/widget_button.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..c476581</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_button.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/widget",</span>&nbsp; <span class='diff-add'> "jquery",</span>&nbsp; <span class='diff-add'> "bootstrap",</span>&nbsp; <span class='diff-add'>], function(widget, $){</span>&nbsp; <span class='diff-add'> var ButtonView = widget.DOMWidgetView.extend({</span>&nbsp; <span class='diff-add'> render : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.setElement($("<button />")</span>&nbsp; <span class='diff-add'> .addClass('btn btn-default'));</span>&nbsp; <span class='diff-add'> this.$el.attr("data-toggle", "tooltip");</span>&nbsp; <span class='diff-add'> this.model.on('change:button_style', function(model, value) {</span>&nbsp; <span class='diff-add'> this.update_button_style();</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.update_button_style('');</span>&nbsp; <span class='diff-add'> this.update(); // Set defaults.</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> this.$el.attr("title", this.model.get("tooltip"));</span>&nbsp; <span class='diff-add'> if (description.length === 0) {</span>&nbsp; <span class='diff-add'> this.$el.html("&nbsp;"); // Preserve button height</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$el.text(description);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (this.model.get('disabled')) {</span>&nbsp; <span class='diff-add'> this.$el.attr('disabled','disabled');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$el.removeAttr('disabled');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return ButtonView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_button_style: function(previous_trait_value) {</span>&nbsp; <span class='diff-add'> var class_map = {</span>&nbsp; <span class='diff-add'> primary: ['btn-primary'],</span>&nbsp; <span class='diff-add'> success: ['btn-success'],</span>&nbsp; <span class='diff-add'> info: ['btn-info'],</span>&nbsp; <span class='diff-add'> warning: ['btn-warning'],</span>&nbsp; <span class='diff-add'> danger: ['btn-danger']</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.update_mapped_classes(class_map, 'button_style', previous_trait_value);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> events: {</span>&nbsp; <span class='diff-add'> // Dictionary of events and their handlers.</span>&nbsp; <span class='diff-add'> 'click': '_handle_click',</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> _handle_click: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handles when the button is clicked.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.send({event: 'click'});</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'ButtonView': ButtonView,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_float.js b/ipynb/Array-feature-overlap-05_files/widget_float.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..1ab98eb</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_float.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/widget",</span>&nbsp; <span class='diff-add'> "widgets/js/widget_int",</span>&nbsp; <span class='diff-add'>], function(widget, int_widgets){</span>&nbsp; <span class='diff-add'> var IntSliderView = int_widgets.IntSliderView;</span>&nbsp; <span class='diff-add'> var IntTextView = int_widgets.IntTextView;</span>&nbsp; <span class='diff-add'> var FloatSliderView = IntSliderView.extend({</span>&nbsp; <span class='diff-add'> _parse_value: parseFloat,</span>&nbsp; <span class='diff-add'> // matches: whitespace?, float, whitespace?, [-:], whitespace?, float</span>&nbsp; <span class='diff-add'> _range_regex: /^\s*([+-]?(?:\d*\.?\d+|\d+\.)(?:[eE][+-]?\d+)?)\s*[-:]\s*([+-]?(?:\d*\.?\d+|\d+\.)(?:[eE][+-]?\d+)?)/,</span>&nbsp; <span class='diff-add'> _validate_slide_value: function(x) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Validate the value of the slider before sending it to the back-end</span>&nbsp; <span class='diff-add'> * and applying it to the other views on the page.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return x;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var FloatTextView = IntTextView.extend({</span>&nbsp; <span class='diff-add'> _parse_value: parseFloat</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'FloatSliderView': FloatSliderView,</span>&nbsp; <span class='diff-add'> 'FloatTextView': FloatTextView,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_image.js b/ipynb/Array-feature-overlap-05_files/widget_image.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..1c926e6</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_image.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/widget",</span>&nbsp; <span class='diff-add'> "jquery",</span>&nbsp; <span class='diff-add'>], function(widget, $){</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var ImageView = widget.DOMWidgetView.extend({ </span>&nbsp; <span class='diff-add'> render : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.setElement($("<img />"));</span>&nbsp; <span class='diff-add'> this.update(); // Set defaults.</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var image_src = 'data:image/' + this.model.get('format') + ';base64,' + this.model.get('_b64value');</span>&nbsp; <span class='diff-add'> this.$el.attr('src', image_src);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var width = this.model.get('width');</span>&nbsp; <span class='diff-add'> if (width !== undefined && width.length > 0) {</span>&nbsp; <span class='diff-add'> this.$el.attr('width', width);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$el.removeAttr('width');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var height = this.model.get('height');</span>&nbsp; <span class='diff-add'> if (height !== undefined && height.length > 0) {</span>&nbsp; <span class='diff-add'> this.$el.attr('height', height);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$el.removeAttr('height');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return ImageView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'ImageView': ImageView,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_int.js b/ipynb/Array-feature-overlap-05_files/widget_int.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..55af301</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_int.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/widget",</span>&nbsp; <span class='diff-add'> "jqueryui",</span>&nbsp; <span class='diff-add'> "base/js/keyboard",</span>&nbsp; <span class='diff-add'> "bootstrap"</span>&nbsp; <span class='diff-add'>], function(widget, $, keyboard){</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var IntSliderView = widget.DOMWidgetView.extend({</span>&nbsp; <span class='diff-add'> render : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .addClass('widget-hbox widget-slider');</span>&nbsp; <span class='diff-add'> this.$label = $('<div />')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .addClass('widget-label')</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.$slider = $('<div />')</span>&nbsp; <span class='diff-add'> .slider({})</span>&nbsp; <span class='diff-add'> .addClass('slider');</span>&nbsp; <span class='diff-add'> // Put the slider in a container </span>&nbsp; <span class='diff-add'> this.$slider_container = $('<div />')</span>&nbsp; <span class='diff-add'> .addClass('widget-hslider')</span>&nbsp; <span class='diff-add'> .append(this.$slider);</span>&nbsp; <span class='diff-add'> this.$el.append(this.$slider_container);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.$readout = $('<div/>')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .addClass('widget-readout')</span>&nbsp; <span class='diff-add'> .attr('contentEditable', true)</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> this.model.on('change:slider_color', function(sender, value) {</span>&nbsp; <span class='diff-add'> this.$slider.find('a').css('background', value);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.$slider.find('a').css('background', this.model.get('slider_color'));</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Set defaults.</span>&nbsp; <span class='diff-add'> this.update();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (name == 'color') {</span>&nbsp; <span class='diff-add'> this.$readout.css(name, value);</span>&nbsp; <span class='diff-add'> } else if (name.substring(0, 4) == 'font') {</span>&nbsp; <span class='diff-add'> this.$readout.css(name, value);</span>&nbsp; <span class='diff-add'> } else if (name.substring(0, 6) == 'border') {</span>&nbsp; <span class='diff-add'> this.$slider.find('a').css(name, value);</span>&nbsp; <span class='diff-add'> this.$slider_container.css(name, value);</span>&nbsp; <span class='diff-add'> } else if (name == 'width' || name == 'height' || name == 'background') {</span>&nbsp; <span class='diff-add'> this.$slider_container.css(name, value);</span>&nbsp; <span class='diff-add'> } else if (name == 'padding' || name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$slider.css(name, value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(options){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> // JQuery slider option keys. These keys happen to have a</span>&nbsp; <span class='diff-add'> // one-to-one mapping with the corrosponding keys of the model.</span>&nbsp; <span class='diff-add'> var jquery_slider_keys = ['step', 'disabled'];</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> that.$slider.slider({});</span>&nbsp; <span class='diff-add'> _.each(jquery_slider_keys, function(key, i) {</span>&nbsp; <span class='diff-add'> var model_value = that.model.get(key);</span>&nbsp; <span class='diff-add'> if (model_value !== undefined) {</span>&nbsp; <span class='diff-add'> that.$slider.slider("option", key, model_value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var max = this.model.get('max');</span>&nbsp; <span class='diff-add'> var min = this.model.get('min');</span>&nbsp; <span class='diff-add'> if (min <= max) {</span>&nbsp; <span class='diff-add'> if (max !== undefined) this.$slider.slider('option', 'max', max);</span>&nbsp; <span class='diff-add'> if (min !== undefined) this.$slider.slider('option', 'min', min);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var range_value = this.model.get("_range");</span>&nbsp; <span class='diff-add'> if (range_value !== undefined) {</span>&nbsp; <span class='diff-add'> this.$slider.slider("option", "range", range_value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // WORKAROUND FOR JQUERY SLIDER BUG.</span>&nbsp; <span class='diff-add'> // The horizontal position of the slider handle</span>&nbsp; <span class='diff-add'> // depends on the value of the slider at the time</span>&nbsp; <span class='diff-add'> // of orientation change. Before applying the new</span>&nbsp; <span class='diff-add'> // workaround, we set the value to the minimum to</span>&nbsp; <span class='diff-add'> // make sure that the horizontal placement of the</span>&nbsp; <span class='diff-add'> // handle in the vertical slider is always </span>&nbsp; <span class='diff-add'> // consistent.</span>&nbsp; <span class='diff-add'> var orientation = this.model.get('orientation');</span>&nbsp; <span class='diff-add'> var min = this.model.get('min');</span>&nbsp; <span class='diff-add'> var max = this.model.get('max');</span>&nbsp; <span class='diff-add'> if (this.model.get('_range')) {</span>&nbsp; <span class='diff-add'> this.$slider.slider('option', 'values', [min, min]);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$slider.slider('option', 'value', min);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.$slider.slider('option', 'orientation', orientation);</span>&nbsp; <span class='diff-add'> var value = this.model.get('value');</span>&nbsp; <span class='diff-add'> if (this.model.get('_range')) {</span>&nbsp; <span class='diff-add'> // values for the range case are validated python-side in</span>&nbsp; <span class='diff-add'> // _Bounded{Int,Float}RangeWidget._validate</span>&nbsp; <span class='diff-add'> this.$slider.slider('option', 'values', value);</span>&nbsp; <span class='diff-add'> this.$readout.text(value.join("-"));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> if(value > max) { </span>&nbsp; <span class='diff-add'> value = max; </span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> else if(value < min){ </span>&nbsp; <span class='diff-add'> value = min; </span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.$slider.slider('option', 'value', value);</span>&nbsp; <span class='diff-add'> this.$readout.text(value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if(this.model.get('value')!=value) {</span>&nbsp; <span class='diff-add'> this.model.set('value', value, {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> // Use the right CSS classes for vertical & horizontal sliders</span>&nbsp; <span class='diff-add'> if (orientation=='vertical') {</span>&nbsp; <span class='diff-add'> this.$slider_container</span>&nbsp; <span class='diff-add'> .removeClass('widget-hslider')</span>&nbsp; <span class='diff-add'> .addClass('widget-vslider');</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .removeClass('widget-hbox')</span>&nbsp; <span class='diff-add'> .addClass('widget-vbox');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$slider_container</span>&nbsp; <span class='diff-add'> .removeClass('widget-vslider')</span>&nbsp; <span class='diff-add'> .addClass('widget-hslider');</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .removeClass('widget-vbox')</span>&nbsp; <span class='diff-add'> .addClass('widget-hbox');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> if (description.length === 0) {</span>&nbsp; <span class='diff-add'> this.$label.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.typeset(this.$label, description);</span>&nbsp; <span class='diff-add'> this.$label.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var readout = this.model.get('readout');</span>&nbsp; <span class='diff-add'> if (readout) {</span>&nbsp; <span class='diff-add'> this.$readout.show();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$readout.hide();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return IntSliderView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> events: {</span>&nbsp; <span class='diff-add'> // Dictionary of events and their handlers.</span>&nbsp; <span class='diff-add'> "slide" : "handleSliderChange",</span>&nbsp; <span class='diff-add'> "blur [contentEditable=true]": "handleTextChange",</span>&nbsp; <span class='diff-add'> "keydown [contentEditable=true]": "handleKeyDown"</span>&nbsp; <span class='diff-add'> }, </span>&nbsp; <span class='diff-add'> handleKeyDown: function(e) {</span>&nbsp; <span class='diff-add'> if (e.keyCode == keyboard.keycodes.enter) {</span>&nbsp; <span class='diff-add'> e.preventDefault();</span>&nbsp; <span class='diff-add'> this.handleTextChange();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> handleTextChange: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * this handles the entry of text into the contentEditable label</span>&nbsp; <span class='diff-add'> * first, the value is checked if it contains a parseable number</span>&nbsp; <span class='diff-add'> * (or pair of numbers, for the _range case)</span>&nbsp; <span class='diff-add'> * then it is clamped within the min-max range of the slider</span>&nbsp; <span class='diff-add'> * finally, the model is updated if the value is to be changed</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * if any of these conditions are not met, the text is reset</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * the step size is not enforced</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var text = this.$readout.text();</span>&nbsp; <span class='diff-add'> var vmin = this.model.get('min');</span>&nbsp; <span class='diff-add'> var vmax = this.model.get('max');</span>&nbsp; <span class='diff-add'> if (this.model.get("_range")) {</span>&nbsp; <span class='diff-add'> // range case</span>&nbsp; <span class='diff-add'> // ranges can be expressed either "val-val" or "val:val" (+spaces)</span>&nbsp; <span class='diff-add'> var match = this._range_regex.exec(text);</span>&nbsp; <span class='diff-add'> if (match) {</span>&nbsp; <span class='diff-add'> var values = [this._parse_value(match[1]),</span>&nbsp; <span class='diff-add'> this._parse_value(match[2])];</span>&nbsp; <span class='diff-add'> // reject input where NaN or lower > upper</span>&nbsp; <span class='diff-add'> if (isNaN(values[0]) ||</span>&nbsp; <span class='diff-add'> isNaN(values[1]) ||</span>&nbsp; <span class='diff-add'> (values[0] > values[1])) {</span>&nbsp; <span class='diff-add'> this.$readout.text(this.model.get('value').join('-'));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // clamp to range</span>&nbsp; <span class='diff-add'> values = [Math.max(Math.min(values[0], vmax), vmin),</span>&nbsp; <span class='diff-add'> Math.max(Math.min(values[1], vmax), vmin)];</span>&nbsp; <span class='diff-add'> if ((values[0] != this.model.get('value')[0]) ||</span>&nbsp; <span class='diff-add'> (values[1] != this.model.get('value')[1])) {</span>&nbsp; <span class='diff-add'> this.$readout.text(values.join('-'));</span>&nbsp; <span class='diff-add'> this.model.set('value', values, {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$readout.text(this.model.get('value').join('-'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$readout.text(this.model.get('value').join('-'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> // single value case</span>&nbsp; <span class='diff-add'> var value = this._parse_value(text);</span>&nbsp; <span class='diff-add'> if (isNaN(value)) {</span>&nbsp; <span class='diff-add'> this.$readout.text(this.model.get('value'));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> value = Math.max(Math.min(value, vmax), vmin);</span>&nbsp; <span class='diff-add'> if (value != this.model.get('value')) {</span>&nbsp; <span class='diff-add'> this.$readout.text(value);</span>&nbsp; <span class='diff-add'> this.model.set('value', value, {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$readout.text(this.model.get('value'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _parse_value: parseInt,</span>&nbsp; <span class='diff-add'> _range_regex: /^\s*([+-]?\d+)\s*[-:]\s*([+-]?\d+)/,</span>&nbsp; <span class='diff-add'> handleSliderChange: function(e, ui) { </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when the slider value is changed.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> * model to update.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var actual_value;</span>&nbsp; <span class='diff-add'> if (this.model.get("_range")) {</span>&nbsp; <span class='diff-add'> actual_value = ui.values.map(this._validate_slide_value);</span>&nbsp; <span class='diff-add'> this.$readout.text(actual_value.join("-"));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> actual_value = this._validate_slide_value(ui.value);</span>&nbsp; <span class='diff-add'> this.$readout.text(actual_value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.model.set('value', actual_value, {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _validate_slide_value: function(x) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Validate the value of the slider before sending it to the back-end</span>&nbsp; <span class='diff-add'> * and applying it to the other views on the page.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Double bit-wise not truncates the decimel (int cast).</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> return ~~x;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var IntTextView = widget.DOMWidgetView.extend({ </span>&nbsp; <span class='diff-add'> render : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .addClass('widget-hbox widget-numeric-text');</span>&nbsp; <span class='diff-add'> this.$label = $('<div />')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .addClass('widget-label')</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> this.$textbox = $('<input type="text" />')</span>&nbsp; <span class='diff-add'> .addClass('form-control')</span>&nbsp; <span class='diff-add'> .addClass('widget-numeric-text')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el);</span>&nbsp; <span class='diff-add'> this.update(); // Set defaults.</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(options){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> var value = this.model.get('value');</span>&nbsp; <span class='diff-add'> if (this._parse_value(this.$textbox.val()) != value) {</span>&nbsp; <span class='diff-add'> this.$textbox.val(value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (this.model.get('disabled')) {</span>&nbsp; <span class='diff-add'> this.$textbox.attr('disabled','disabled');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$textbox.removeAttr('disabled');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> if (description.length === 0) {</span>&nbsp; <span class='diff-add'> this.$label.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.typeset(this.$label, description);</span>&nbsp; <span class='diff-add'> this.$label.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return IntTextView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$textbox.css(name, value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> events: {</span>&nbsp; <span class='diff-add'> // Dictionary of events and their handlers.</span>&nbsp; <span class='diff-add'> "keyup input" : "handleChanging",</span>&nbsp; <span class='diff-add'> "paste input" : "handleChanging",</span>&nbsp; <span class='diff-add'> "cut input" : "handleChanging",</span>&nbsp; <span class='diff-add'> // Fires only when control is validated or looses focus.</span>&nbsp; <span class='diff-add'> "change input" : "handleChanged"</span>&nbsp; <span class='diff-add'> }, </span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> handleChanging: function(e) { </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handles and validates user input.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Try to parse value as a int.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var numericalValue = 0;</span>&nbsp; <span class='diff-add'> var trimmed = e.target.value.trim();</span>&nbsp; <span class='diff-add'> if (trimmed === '') {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> if (!(['-', '-.', '.', '+.', '+'].indexOf(trimmed) >= 0)) {</span>&nbsp; <span class='diff-add'> numericalValue = this._parse_value(e.target.value); </span>&nbsp; <span class='diff-add'> } </span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // If parse failed, reset value to value stored in model.</span>&nbsp; <span class='diff-add'> if (isNaN(numericalValue)) {</span>&nbsp; <span class='diff-add'> e.target.value = this.model.get('value');</span>&nbsp; <span class='diff-add'> } else if (!isNaN(numericalValue)) {</span>&nbsp; <span class='diff-add'> if (this.model.get('max') !== undefined) {</span>&nbsp; <span class='diff-add'> numericalValue = Math.min(this.model.get('max'), numericalValue);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (this.model.get('min') !== undefined) {</span>&nbsp; <span class='diff-add'> numericalValue = Math.max(this.model.get('min'), numericalValue);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Apply the value if it has changed.</span>&nbsp; <span class='diff-add'> if (numericalValue != this.model.get('value')) {</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> // model to update.</span>&nbsp; <span class='diff-add'> this.model.set('value', numericalValue, {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> handleChanged: function(e) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Applies validated input.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (e.target.value.trim() === '' || e.target.value !== this.model.get('value')) {</span>&nbsp; <span class='diff-add'> e.target.value = this.model.get('value');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _parse_value: parseInt</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var ProgressView = widget.DOMWidgetView.extend({</span>&nbsp; <span class='diff-add'> render : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .addClass('widget-hbox widget-progress');</span>&nbsp; <span class='diff-add'> this.$label = $('<div />')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .addClass('widget-label')</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> this.$progress = $('<div />')</span>&nbsp; <span class='diff-add'> .addClass('progress')</span>&nbsp; <span class='diff-add'> .addClass('widget-progress')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el);</span>&nbsp; <span class='diff-add'> this.$bar = $('<div />')</span>&nbsp; <span class='diff-add'> .addClass('progress-bar')</span>&nbsp; <span class='diff-add'> .css('width', '50%')</span>&nbsp; <span class='diff-add'> .appendTo(this.$progress);</span>&nbsp; <span class='diff-add'> this.update(); // Set defaults.</span>&nbsp; <span class='diff-add'> this.model.on('change:bar_style', function(model, value) {</span>&nbsp; <span class='diff-add'> this.update_bar_style();</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.update_bar_style('');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var value = this.model.get('value');</span>&nbsp; <span class='diff-add'> var max = this.model.get('max');</span>&nbsp; <span class='diff-add'> var min = this.model.get('min');</span>&nbsp; <span class='diff-add'> var percent = 100.0 * (value - min) / (max - min);</span>&nbsp; <span class='diff-add'> this.$bar.css('width', percent + '%');</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> if (description.length === 0) {</span>&nbsp; <span class='diff-add'> this.$label.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.typeset(this.$label, description);</span>&nbsp; <span class='diff-add'> this.$label.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return ProgressView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> }, </span>&nbsp; <span class='diff-add'> update_bar_style: function(previous_trait_value) {</span>&nbsp; <span class='diff-add'> var class_map = {</span>&nbsp; <span class='diff-add'> success: ['progress-bar-success'],</span>&nbsp; <span class='diff-add'> info: ['progress-bar-info'],</span>&nbsp; <span class='diff-add'> warning: ['progress-bar-warning'],</span>&nbsp; <span class='diff-add'> danger: ['progress-bar-danger']</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.update_mapped_classes(class_map, 'bar_style', previous_trait_value, this.$bar);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (name.substring(0, 6) == 'border' || name == 'width' || </span>&nbsp; <span class='diff-add'> name == 'height' || name == 'background' || name == 'margin' || </span>&nbsp; <span class='diff-add'> name == 'padding') {</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.$progress.css(name, value);</span>&nbsp; <span class='diff-add'> } else if (name == 'color') { </span>&nbsp; <span class='diff-add'> this.$bar.css('background', value);</span>&nbsp; <span class='diff-add'> } else if (name == 'padding' || name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$bar.css(name, value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'IntSliderView': IntSliderView, </span>&nbsp; <span class='diff-add'> 'IntTextView': IntTextView,</span>&nbsp; <span class='diff-add'> 'ProgressView': ProgressView,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_link.js b/ipynb/Array-feature-overlap-05_files/widget_link.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..ba76dbd</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_link.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/widget",</span>&nbsp; <span class='diff-add'> "jquery",</span>&nbsp; <span class='diff-add'>], function(widget, $){</span>&nbsp; <span class='diff-add'> var LinkModel = widget.WidgetModel.extend({</span>&nbsp; <span class='diff-add'> initialize: function() {</span>&nbsp; <span class='diff-add'> this.on("change:widgets", function(model, value, options) {</span>&nbsp; <span class='diff-add'> this.update_bindings(model.previous("widgets") || [], value);</span>&nbsp; <span class='diff-add'> this.update_value(this.get("widgets")[0]);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.once("destroy", function(model, collection, options) {</span>&nbsp; <span class='diff-add'> this.update_bindings(this.get("widgets"), []);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_bindings: function(oldlist, newlist) {</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> _.each(oldlist, function(elt) {elt[0].off("change:" + elt[1], null, that);});</span>&nbsp; <span class='diff-add'> _.each(newlist, function(elt) {elt[0].on("change:" + elt[1],</span>&nbsp; <span class='diff-add'> function(model, value, options) {</span>&nbsp; <span class='diff-add'> that.update_value(elt);</span>&nbsp; <span class='diff-add'> }, that);</span>&nbsp; <span class='diff-add'> // TODO: register for any destruction handlers</span>&nbsp; <span class='diff-add'> // to take an item out of the list</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_value: function(elt) {</span>&nbsp; <span class='diff-add'> if (this.updating) {return;}</span>&nbsp; <span class='diff-add'> var model = elt[0];</span>&nbsp; <span class='diff-add'> var attr = elt[1];</span>&nbsp; <span class='diff-add'> var new_value = model.get(attr);</span>&nbsp; <span class='diff-add'> this.updating = true;</span>&nbsp; <span class='diff-add'> _.each(_.without(this.get("widgets"), elt),</span>&nbsp; <span class='diff-add'> function(element, index, list) {</span>&nbsp; <span class='diff-add'> if (element[0]) {</span>&nbsp; <span class='diff-add'> element[0].set(element[1], new_value);</span>&nbsp; <span class='diff-add'> element[0].save_changes();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.updating = false;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var DirectionalLinkModel = widget.WidgetModel.extend({</span>&nbsp; <span class='diff-add'> initialize: function() {</span>&nbsp; <span class='diff-add'> this.on("change", this.update_bindings, this);</span>&nbsp; <span class='diff-add'> this.once("destroy", function() {</span>&nbsp; <span class='diff-add'> if (this.source) {</span>&nbsp; <span class='diff-add'> this.source[0].off("change:" + this.source[1], null, this);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_bindings: function() {</span>&nbsp; <span class='diff-add'> if (this.source) {</span>&nbsp; <span class='diff-add'> this.source[0].off("change:" + this.source[1], null, this);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.source = this.get("source");</span>&nbsp; <span class='diff-add'> if (this.source) {</span>&nbsp; <span class='diff-add'> this.source[0].on("change:" + this.source[1], function() { this.update_value(this.source); }, this);</span>&nbsp; <span class='diff-add'> this.update_value(this.source);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_value: function(elt) {</span>&nbsp; <span class='diff-add'> if (this.updating) {return;}</span>&nbsp; <span class='diff-add'> var model = elt[0];</span>&nbsp; <span class='diff-add'> var attr = elt[1];</span>&nbsp; <span class='diff-add'> var new_value = model.get(attr);</span>&nbsp; <span class='diff-add'> this.updating = true;</span>&nbsp; <span class='diff-add'> _.each(this.get("targets"),</span>&nbsp; <span class='diff-add'> function(element, index, list) {</span>&nbsp; <span class='diff-add'> if (element[0]) {</span>&nbsp; <span class='diff-add'> element[0].set(element[1], new_value);</span>&nbsp; <span class='diff-add'> element[0].save_changes();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.updating = false;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> "LinkModel": LinkModel,</span>&nbsp; <span class='diff-add'> "DirectionalLinkModel": DirectionalLinkModel,</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_output.js b/ipynb/Array-feature-overlap-05_files/widget_output.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..a9fa4c3</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_output.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/widget",</span>&nbsp; <span class='diff-add'> "jquery",</span>&nbsp; <span class='diff-add'> 'notebook/js/outputarea',</span>&nbsp; <span class='diff-add'>], function(widget, $, outputarea) {</span>&nbsp; <span class='diff-add'> 'use strict';</span>&nbsp; <span class='diff-add'> var OutputView = widget.DOMWidgetView.extend({</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Public constructor</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> initialize: function (parameters) {</span>&nbsp; <span class='diff-add'> OutputView.__super__.initialize.apply(this, [parameters]);</span>&nbsp; <span class='diff-add'> this.model.on('msg:custom', this._handle_route_msg, this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> render: function(){</span>&nbsp; <span class='diff-add'> this.output_area = new outputarea.OutputArea({</span>&nbsp; <span class='diff-add'> selector: this.$el, </span>&nbsp; <span class='diff-add'> prompt_area: false, </span>&nbsp; <span class='diff-add'> events: this.model.widget_manager.notebook.events, </span>&nbsp; <span class='diff-add'> keyboard_manager: this.model.widget_manager.keyboard_manager });</span>&nbsp; <span class='diff-add'> // Make output area reactive.</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> this.output_area.element.on('changed', function() {</span>&nbsp; <span class='diff-add'> that.model.set('contents', that.output_area.element.html());</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.model.on('change:contents', function(){</span>&nbsp; <span class='diff-add'> var html = this.model.get('contents');</span>&nbsp; <span class='diff-add'> if (this.output_area.element.html() != html) {</span>&nbsp; <span class='diff-add'> this.output_area.element.html(html);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> // Set initial contents.</span>&nbsp; <span class='diff-add'> this.output_area.element.html(this.model.get('contents'));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handles re-routed iopub messages.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> _handle_route_msg: function(msg) {</span>&nbsp; <span class='diff-add'> if (msg) {</span>&nbsp; <span class='diff-add'> var msg_type = msg.msg_type;</span>&nbsp; <span class='diff-add'> if (msg_type=='clear_output') {</span>&nbsp; <span class='diff-add'> this.output_area.handle_clear_output(msg);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.output_area.handle_output(msg);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'OutputView': OutputView,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_selection.js b/ipynb/Array-feature-overlap-05_files/widget_selection.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..c487834</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_selection.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/widget",</span>&nbsp; <span class='diff-add'> "base/js/utils",</span>&nbsp; <span class='diff-add'> "jquery",</span>&nbsp; <span class='diff-add'> "underscore",</span>&nbsp; <span class='diff-add'> "bootstrap",</span>&nbsp; <span class='diff-add'>], function(widget, utils, $, _){</span>&nbsp; <span class='diff-add'> var DropdownView = widget.DOMWidgetView.extend({</span>&nbsp; <span class='diff-add'> render : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .addClass('widget-hbox widget-dropdown');</span>&nbsp; <span class='diff-add'> this.$label = $('<div />')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .addClass('widget-label')</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> this.$buttongroup = $('<div />')</span>&nbsp; <span class='diff-add'> .addClass('widget_item')</span>&nbsp; <span class='diff-add'> .addClass('btn-group')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el);</span>&nbsp; <span class='diff-add'> this.$droplabel = $('<button />')</span>&nbsp; <span class='diff-add'> .addClass('btn btn-default')</span>&nbsp; <span class='diff-add'> .addClass('widget-combo-btn')</span>&nbsp; <span class='diff-add'> .html("&nbsp;")</span>&nbsp; <span class='diff-add'> .appendTo(this.$buttongroup);</span>&nbsp; <span class='diff-add'> this.$dropbutton = $('<button />')</span>&nbsp; <span class='diff-add'> .addClass('btn btn-default')</span>&nbsp; <span class='diff-add'> .addClass('dropdown-toggle')</span>&nbsp; <span class='diff-add'> .addClass('widget-combo-carrot-btn')</span>&nbsp; <span class='diff-add'> .attr('data-toggle', 'dropdown')</span>&nbsp; <span class='diff-add'> .append($('<span />').addClass("caret"))</span>&nbsp; <span class='diff-add'> .appendTo(this.$buttongroup);</span>&nbsp; <span class='diff-add'> this.$droplist = $('<ul />')</span>&nbsp; <span class='diff-add'> .addClass('dropdown-menu')</span>&nbsp; <span class='diff-add'> .appendTo(this.$buttongroup);</span>&nbsp; <span class='diff-add'> this.model.on('change:button_style', function(model, value) {</span>&nbsp; <span class='diff-add'> this.update_button_style();</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.update_button_style('');</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Set defaults.</span>&nbsp; <span class='diff-add'> this.update();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(options){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been</span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> var selected_item_text = this.model.get('selected_label');</span>&nbsp; <span class='diff-add'> if (selected_item_text.trim().length === 0) {</span>&nbsp; <span class='diff-add'> this.$droplabel.html("&nbsp;");</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$droplabel.text(selected_item_text);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var items = this.model.get('_options_labels');</span>&nbsp; <span class='diff-add'> var $replace_droplist = $('<ul />')</span>&nbsp; <span class='diff-add'> .addClass('dropdown-menu');</span>&nbsp; <span class='diff-add'> // Copy the style</span>&nbsp; <span class='diff-add'> $replace_droplist.attr('style', this.$droplist.attr('style'));</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> _.each(items, function(item, i) {</span>&nbsp; <span class='diff-add'> var item_button = $('<a href="#"/>')</span>&nbsp; <span class='diff-add'> .text(item)</span>&nbsp; <span class='diff-add'> .on('click', $.proxy(that.handle_click, that));</span>&nbsp; <span class='diff-add'> $replace_droplist.append($('<li />').append(item_button));</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> this.$droplist.replaceWith($replace_droplist);</span>&nbsp; <span class='diff-add'> this.$droplist.remove();</span>&nbsp; <span class='diff-add'> this.$droplist = $replace_droplist;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (this.model.get('disabled')) {</span>&nbsp; <span class='diff-add'> this.$buttongroup.attr('disabled','disabled');</span>&nbsp; <span class='diff-add'> this.$droplabel.attr('disabled','disabled');</span>&nbsp; <span class='diff-add'> this.$dropbutton.attr('disabled','disabled');</span>&nbsp; <span class='diff-add'> this.$droplist.attr('disabled','disabled');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$buttongroup.removeAttr('disabled');</span>&nbsp; <span class='diff-add'> this.$droplabel.removeAttr('disabled');</span>&nbsp; <span class='diff-add'> this.$dropbutton.removeAttr('disabled');</span>&nbsp; <span class='diff-add'> this.$droplist.removeAttr('disabled');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> if (description.length === 0) {</span>&nbsp; <span class='diff-add'> this.$label.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.typeset(this.$label, description);</span>&nbsp; <span class='diff-add'> this.$label.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return DropdownView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_button_style: function(previous_trait_value) {</span>&nbsp; <span class='diff-add'> var class_map = {</span>&nbsp; <span class='diff-add'> primary: ['btn-primary'],</span>&nbsp; <span class='diff-add'> success: ['btn-success'],</span>&nbsp; <span class='diff-add'> info: ['btn-info'],</span>&nbsp; <span class='diff-add'> warning: ['btn-warning'],</span>&nbsp; <span class='diff-add'> danger: ['btn-danger']</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.update_mapped_classes(class_map, 'button_style', previous_trait_value, this.$droplabel);</span>&nbsp; <span class='diff-add'> this.update_mapped_classes(class_map, 'button_style', previous_trait_value, this.$dropbutton);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (name.substring(0, 6) == 'border' || name == 'background' || name == 'color') {</span>&nbsp; <span class='diff-add'> this.$droplabel.css(name, value);</span>&nbsp; <span class='diff-add'> this.$dropbutton.css(name, value);</span>&nbsp; <span class='diff-add'> this.$droplist.css(name, value);</span>&nbsp; <span class='diff-add'> } else if (name == 'width') {</span>&nbsp; <span class='diff-add'> this.$droplist.css(name, value);</span>&nbsp; <span class='diff-add'> this.$droplabel.css(name, value);</span>&nbsp; <span class='diff-add'> } else if (name == 'padding') {</span>&nbsp; <span class='diff-add'> this.$droplist.css(name, value);</span>&nbsp; <span class='diff-add'> this.$buttongroup.css(name, value);</span>&nbsp; <span class='diff-add'> } else if (name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$buttongroup.css(name, value);</span>&nbsp; <span class='diff-add'> } else if (name == 'height') {</span>&nbsp; <span class='diff-add'> this.$droplabel.css(name, value);</span>&nbsp; <span class='diff-add'> this.$dropbutton.css(name, value);</span>&nbsp; <span class='diff-add'> } else if (name == 'padding' || name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$droplist.css(name, value);</span>&nbsp; <span class='diff-add'> this.$droplabel.css(name, value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> handle_click: function (e) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle when a value is clicked.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> * model to update.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.model.set('selected_label', $(e.target).text(), {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> // Manually hide the droplist.</span>&nbsp; <span class='diff-add'> e.stopPropagation();</span>&nbsp; <span class='diff-add'> e.preventDefault();</span>&nbsp; <span class='diff-add'> this.$buttongroup.removeClass('open');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var RadioButtonsView = widget.DOMWidgetView.extend({ </span>&nbsp; <span class='diff-add'> render : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .addClass('widget-hbox widget-radio');</span>&nbsp; <span class='diff-add'> this.$label = $('<div />')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .addClass('widget-label')</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> this.$container = $('<div />')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .addClass('widget-radio-box');</span>&nbsp; <span class='diff-add'> this.update();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(options){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> // Add missing items to the DOM.</span>&nbsp; <span class='diff-add'> var items = this.model.get('_options_labels');</span>&nbsp; <span class='diff-add'> var disabled = this.model.get('disabled');</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> _.each(items, function(item, index) {</span>&nbsp; <span class='diff-add'> var item_query = ' :input[data-value="' + encodeURIComponent(item) + '"]';</span>&nbsp; <span class='diff-add'> if (that.$el.find(item_query).length === 0) {</span>&nbsp; <span class='diff-add'> var $label = $('<label />')</span>&nbsp; <span class='diff-add'> .addClass('radio')</span>&nbsp; <span class='diff-add'> .text(item)</span>&nbsp; <span class='diff-add'> .appendTo(that.$container);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> $('<input />')</span>&nbsp; <span class='diff-add'> .attr('type', 'radio')</span>&nbsp; <span class='diff-add'> .addClass(that.model)</span>&nbsp; <span class='diff-add'> .val(item)</span>&nbsp; <span class='diff-add'> .attr('data-value', encodeURIComponent(item))</span>&nbsp; <span class='diff-add'> .prependTo($label)</span>&nbsp; <span class='diff-add'> .on('click', $.proxy(that.handle_click, that));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var $item_element = that.$container.find(item_query);</span>&nbsp; <span class='diff-add'> if (that.model.get('selected_label') == item) {</span>&nbsp; <span class='diff-add'> $item_element.prop('checked', true);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> $item_element.prop('checked', false);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> $item_element.prop('disabled', disabled);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Remove items that no longer exist.</span>&nbsp; <span class='diff-add'> this.$container.find('input').each(function(i, obj) {</span>&nbsp; <span class='diff-add'> var value = $(obj).val();</span>&nbsp; <span class='diff-add'> var found = false;</span>&nbsp; <span class='diff-add'> _.each(items, function(item, index) {</span>&nbsp; <span class='diff-add'> if (item == value) {</span>&nbsp; <span class='diff-add'> found = true;</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (!found) {</span>&nbsp; <span class='diff-add'> $(obj).parent().remove();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> if (description.length === 0) {</span>&nbsp; <span class='diff-add'> this.$label.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$label.text(description);</span>&nbsp; <span class='diff-add'> this.typeset(this.$label, description);</span>&nbsp; <span class='diff-add'> this.$label.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return RadioButtonsView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$container.css(name, value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> handle_click: function (e) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle when a value is clicked.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> * model to update.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.model.set('selected_label', $(e.target).val(), {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var ToggleButtonsView = widget.DOMWidgetView.extend({</span>&nbsp; <span class='diff-add'> initialize: function() {</span>&nbsp; <span class='diff-add'> this._css_state = {};</span>&nbsp; <span class='diff-add'> ToggleButtonsView.__super__.initialize.apply(this, arguments);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> render: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .addClass('widget-hbox widget-toggle-buttons');</span>&nbsp; <span class='diff-add'> this.$label = $('<div />')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .addClass('widget-label')</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> this.$buttongroup = $('<div />')</span>&nbsp; <span class='diff-add'> .addClass('btn-group')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el);</span>&nbsp; <span class='diff-add'> this.model.on('change:button_style', function(model, value) {</span>&nbsp; <span class='diff-add'> this.update_button_style();</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.update_button_style('');</span>&nbsp; <span class='diff-add'> this.update();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(options){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> // Add missing items to the DOM.</span>&nbsp; <span class='diff-add'> var items = this.model.get('_options_labels');</span>&nbsp; <span class='diff-add'> var disabled = this.model.get('disabled');</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var item_html;</span>&nbsp; <span class='diff-add'> _.each(items, function(item, index) {</span>&nbsp; <span class='diff-add'> if (item.trim().length === 0) {</span>&nbsp; <span class='diff-add'> item_html = "&nbsp;";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> item_html = utils.escape_html(item);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var item_query = '[data-value="' + encodeURIComponent(item) + '"]';</span>&nbsp; <span class='diff-add'> var $item_element = that.$buttongroup.find(item_query);</span>&nbsp; <span class='diff-add'> if (!$item_element.length) {</span>&nbsp; <span class='diff-add'> $item_element = $('<button/>')</span>&nbsp; <span class='diff-add'> .attr('type', 'button')</span>&nbsp; <span class='diff-add'> .addClass('btn btn-default')</span>&nbsp; <span class='diff-add'> .html(item_html)</span>&nbsp; <span class='diff-add'> .appendTo(that.$buttongroup)</span>&nbsp; <span class='diff-add'> .attr('data-value', encodeURIComponent(item))</span>&nbsp; <span class='diff-add'> .attr('value', item)</span>&nbsp; <span class='diff-add'> .on('click', $.proxy(that.handle_click, that));</span>&nbsp; <span class='diff-add'> that.update_style_traits($item_element);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (that.model.get('selected_label') == item) {</span>&nbsp; <span class='diff-add'> $item_element.addClass('active');</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> $item_element.removeClass('active');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> $item_element.prop('disabled', disabled); </span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Remove items that no longer exist.</span>&nbsp; <span class='diff-add'> this.$buttongroup.find('button').each(function(i, obj) {</span>&nbsp; <span class='diff-add'> var value = $(obj).attr('value');</span>&nbsp; <span class='diff-add'> var found = false;</span>&nbsp; <span class='diff-add'> _.each(items, function(item, index) {</span>&nbsp; <span class='diff-add'> if (item == value) {</span>&nbsp; <span class='diff-add'> found = true;</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> if (!found) {</span>&nbsp; <span class='diff-add'> $(obj).remove();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> if (description.length === 0) {</span>&nbsp; <span class='diff-add'> this.$label.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$label.text();</span>&nbsp; <span class='diff-add'> this.typeset(this.$label, description);</span>&nbsp; <span class='diff-add'> this.$label.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return ToggleButtonsView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this._css_state[name] = value;</span>&nbsp; <span class='diff-add'> this.update_style_traits();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_style_traits: function(button) {</span>&nbsp; <span class='diff-add'> for (var name in this._css_state) {</span>&nbsp; <span class='diff-add'> if (this._css_state.hasOwnProperty(name)) {</span>&nbsp; <span class='diff-add'> if (name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$buttongroup.css(name, this._css_state[name]);</span>&nbsp; <span class='diff-add'> } else if (name != 'width') {</span>&nbsp; <span class='diff-add'> if (button) {</span>&nbsp; <span class='diff-add'> button.css(name, this._css_state[name]);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$buttongroup.find('button').css(name, this._css_state[name]);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_button_style: function(previous_trait_value) {</span>&nbsp; <span class='diff-add'> var class_map = {</span>&nbsp; <span class='diff-add'> primary: ['btn-primary'],</span>&nbsp; <span class='diff-add'> success: ['btn-success'],</span>&nbsp; <span class='diff-add'> info: ['btn-info'],</span>&nbsp; <span class='diff-add'> warning: ['btn-warning'],</span>&nbsp; <span class='diff-add'> danger: ['btn-danger']</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> this.update_mapped_classes(class_map, 'button_style', previous_trait_value, this.$buttongroup.find('button'));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> handle_click: function (e) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle when a value is clicked.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> * model to update.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.model.set('selected_label', $(e.target).attr('value'), {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> }, </span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var SelectView = widget.DOMWidgetView.extend({ </span>&nbsp; <span class='diff-add'> render : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .addClass('widget-hbox widget-select');</span>&nbsp; <span class='diff-add'> this.$label = $('<div />')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .addClass('widget-label')</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> this.$listbox = $('<select />')</span>&nbsp; <span class='diff-add'> .addClass('widget-listbox form-control')</span>&nbsp; <span class='diff-add'> .attr('size', 6)</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .on('change', $.proxy(this.handle_change, this));</span>&nbsp; <span class='diff-add'> this.update();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(options){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> // Add missing items to the DOM.</span>&nbsp; <span class='diff-add'> var items = this.model.get('_options_labels');</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> _.each(items, function(item, index) {</span>&nbsp; <span class='diff-add'> var item_query = 'option[data-value="' + encodeURIComponent(item) + '"]';</span>&nbsp; <span class='diff-add'> if (that.$listbox.find(item_query).length === 0) {</span>&nbsp; <span class='diff-add'> $('<option />')</span>&nbsp; <span class='diff-add'> .text(item)</span>&nbsp; <span class='diff-add'> .attr('data-value', encodeURIComponent(item))</span>&nbsp; <span class='diff-add'> .attr('selected_label', item)</span>&nbsp; <span class='diff-add'> .on("click", $.proxy(that.handle_click, that))</span>&nbsp; <span class='diff-add'> .appendTo(that.$listbox);</span>&nbsp; <span class='diff-add'> } </span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> // Select the correct element</span>&nbsp; <span class='diff-add'> this.$listbox.val(this.model.get('selected_label'));</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Disable listbox if needed</span>&nbsp; <span class='diff-add'> var disabled = this.model.get('disabled');</span>&nbsp; <span class='diff-add'> this.$listbox.prop('disabled', disabled);</span>&nbsp; <span class='diff-add'> // Remove items that no longer exist.</span>&nbsp; <span class='diff-add'> this.$listbox.find('option').each(function(i, obj) {</span>&nbsp; <span class='diff-add'> var value = $(obj).text();</span>&nbsp; <span class='diff-add'> var found = false;</span>&nbsp; <span class='diff-add'> _.each(items, function(item, index) {</span>&nbsp; <span class='diff-add'> if (item == value) {</span>&nbsp; <span class='diff-add'> found = true;</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> if (!found) {</span>&nbsp; <span class='diff-add'> $(obj).remove();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> if (description.length === 0) {</span>&nbsp; <span class='diff-add'> this.$label.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.typeset(this.$label, description);</span>&nbsp; <span class='diff-add'> this.$label.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return SelectView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$listbox.css(name, value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> handle_click: function (e) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle when a new value is clicked.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$listbox.val($(e.target).val()).change();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> handle_change: function (e) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle when a new value is selected.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> * model to update.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.model.set('selected_label', this.$listbox.val(), {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var SelectMultipleView = SelectView.extend({</span>&nbsp; <span class='diff-add'> render: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> SelectMultipleView.__super__.render.apply(this);</span>&nbsp; <span class='diff-add'> this.$el.removeClass('widget-select')</span>&nbsp; <span class='diff-add'> .addClass('widget-select-multiple');</span>&nbsp; <span class='diff-add'> this.$listbox.attr('multiple', true)</span>&nbsp; <span class='diff-add'> .on('change', $.proxy(this.handle_change, this));</span>&nbsp; <span class='diff-add'> return this;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> SelectMultipleView.__super__.update.apply(this, arguments);</span>&nbsp; <span class='diff-add'> this.$listbox.val(this.model.get('selected_labels'));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> handle_change: function (e) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle when a new value is selected.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> * model to update.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.model.set('selected_labels',</span>&nbsp; <span class='diff-add'> (this.$listbox.val() || []).slice(),</span>&nbsp; <span class='diff-add'> {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'DropdownView': DropdownView,</span>&nbsp; <span class='diff-add'> 'RadioButtonsView': RadioButtonsView,</span>&nbsp; <span class='diff-add'> 'ToggleButtonsView': ToggleButtonsView,</span>&nbsp; <span class='diff-add'> 'SelectView': SelectView,</span>&nbsp; <span class='diff-add'> 'SelectMultipleView': SelectMultipleView,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_selectioncontainer.js b/ipynb/Array-feature-overlap-05_files/widget_selectioncontainer.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..446a236</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_selectioncontainer.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/widget",</span>&nbsp; <span class='diff-add'> "base/js/utils",</span>&nbsp; <span class='diff-add'> "jquery",</span>&nbsp; <span class='diff-add'> "bootstrap",</span>&nbsp; <span class='diff-add'>], function(widget, utils, $){</span>&nbsp; <span class='diff-add'> var AccordionView = widget.DOMWidgetView.extend({</span>&nbsp; <span class='diff-add'> initialize: function(){</span>&nbsp; <span class='diff-add'> AccordionView.__super__.initialize.apply(this, arguments);</span>&nbsp; <span class='diff-add'> this.containers = [];</span>&nbsp; <span class='diff-add'> this.model_containers = {};</span>&nbsp; <span class='diff-add'> this.children_views = new widget.ViewList(this.add_child_view, this.remove_child_view, this);</span>&nbsp; <span class='diff-add'> this.listenTo(this.model, 'change:children', function(model, value) {</span>&nbsp; <span class='diff-add'> this.children_views.update(value);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> render: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var guid = 'panel-group' + utils.uuid();</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .attr('id', guid)</span>&nbsp; <span class='diff-add'> .addClass('panel-group');</span>&nbsp; <span class='diff-add'> this.model.on('change:selected_index', function(model, value, options) {</span>&nbsp; <span class='diff-add'> this.update_selected_index(options);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.model.on('change:_titles', function(model, value, options) {</span>&nbsp; <span class='diff-add'> this.update_titles(options);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.on('displayed', function() {</span>&nbsp; <span class='diff-add'> this.update_titles();</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.children_views.update(this.model.get('children'));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> update: function(options) {</span>&nbsp; <span class='diff-add'> this.update_titles();</span>&nbsp; <span class='diff-add'> this.update_selected_index(options);</span>&nbsp; <span class='diff-add'> return TabView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_titles: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set tab titles</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var titles = this.model.get('_titles');</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> _.each(titles, function(title, page_index) {</span>&nbsp; <span class='diff-add'> var accordian = that.containers[page_index];</span>&nbsp; <span class='diff-add'> if (accordian !== undefined) {</span>&nbsp; <span class='diff-add'> accordian</span>&nbsp; <span class='diff-add'> .find('.panel-heading')</span>&nbsp; <span class='diff-add'> .find('.accordion-toggle')</span>&nbsp; <span class='diff-add'> .text(title);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_selected_index: function(options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Only update the selection if the selection wasn't triggered</span>&nbsp; <span class='diff-add'> * by the front-end. It must be triggered by the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> var old_index = this.model.previous('selected_index');</span>&nbsp; <span class='diff-add'> var new_index = this.model.get('selected_index');</span>&nbsp; <span class='diff-add'> this.containers[old_index].find('.panel-collapse').collapse('hide');</span>&nbsp; <span class='diff-add'> if (0 <= new_index && new_index < this.containers.length) {</span>&nbsp; <span class='diff-add'> this.containers[new_index].find('.panel-collapse').collapse('show');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> remove_child_view: function(view) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when a child is removed from children list.</span>&nbsp; <span class='diff-add'> * TODO: does this handle two different views of the same model as children?</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var model = view.model;</span>&nbsp; <span class='diff-add'> var accordion_group = this.model_containers[model.id];</span>&nbsp; <span class='diff-add'> this.containers.splice(accordion_group.container_index, 1);</span>&nbsp; <span class='diff-add'> delete this.model_containers[model.id];</span>&nbsp; <span class='diff-add'> accordion_group.remove();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> add_child_view: function(model) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when a child is added to children list.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var index = this.containers.length;</span>&nbsp; <span class='diff-add'> var uuid = utils.uuid();</span>&nbsp; <span class='diff-add'> var accordion_group = $('<div />')</span>&nbsp; <span class='diff-add'> .addClass('panel panel-default')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el);</span>&nbsp; <span class='diff-add'> var accordion_heading = $('<div />')</span>&nbsp; <span class='diff-add'> .addClass('panel-heading')</span>&nbsp; <span class='diff-add'> .appendTo(accordion_group);</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var accordion_toggle = $('<a />')</span>&nbsp; <span class='diff-add'> .addClass('accordion-toggle')</span>&nbsp; <span class='diff-add'> .attr('data-toggle', 'collapse')</span>&nbsp; <span class='diff-add'> .attr('data-parent', '#' + this.$el.attr('id'))</span>&nbsp; <span class='diff-add'> .attr('href', '#' + uuid)</span>&nbsp; <span class='diff-add'> .click(function(evt){ </span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> // model to update.</span>&nbsp; <span class='diff-add'> that.model.set("selected_index", index, {updated_view: that});</span>&nbsp; <span class='diff-add'> that.touch();</span>&nbsp; <span class='diff-add'> })</span>&nbsp; <span class='diff-add'> .text('Page ' + index)</span>&nbsp; <span class='diff-add'> .appendTo(accordion_heading);</span>&nbsp; <span class='diff-add'> var accordion_body = $('<div />', {id: uuid})</span>&nbsp; <span class='diff-add'> .addClass('panel-collapse collapse')</span>&nbsp; <span class='diff-add'> .appendTo(accordion_group);</span>&nbsp; <span class='diff-add'> var accordion_inner = $('<div />')</span>&nbsp; <span class='diff-add'> .addClass('panel-body')</span>&nbsp; <span class='diff-add'> .appendTo(accordion_body);</span>&nbsp; <span class='diff-add'> var container_index = this.containers.push(accordion_group) - 1;</span>&nbsp; <span class='diff-add'> accordion_group.container_index = container_index;</span>&nbsp; <span class='diff-add'> this.model_containers[model.id] = accordion_group;</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var dummy = $('<div/>');</span>&nbsp; <span class='diff-add'> accordion_inner.append(dummy);</span>&nbsp; <span class='diff-add'> return this.create_child_view(model).then(function(view) {</span>&nbsp; <span class='diff-add'> dummy.replaceWith(view.$el);</span>&nbsp; <span class='diff-add'> that.update();</span>&nbsp; <span class='diff-add'> that.update_titles();</span>&nbsp; <span class='diff-add'> // Trigger the displayed event of the child view.</span>&nbsp; <span class='diff-add'> that.after_displayed(function() {</span>&nbsp; <span class='diff-add'> view.trigger('displayed');</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return view;</span>&nbsp; <span class='diff-add'> }).catch(utils.reject("Couldn't add child view to box", true));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> remove: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * We remove this widget before removing the children as an optimization</span>&nbsp; <span class='diff-add'> * we want to remove the entire container from the DOM first before</span>&nbsp; <span class='diff-add'> * removing each individual child separately.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> AccordionView.__super__.remove.apply(this, arguments);</span>&nbsp; <span class='diff-add'> this.children_views.remove();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> var TabView = widget.DOMWidgetView.extend({ </span>&nbsp; <span class='diff-add'> initialize: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Public constructor.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> TabView.__super__.initialize.apply(this, arguments);</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> this.containers = [];</span>&nbsp; <span class='diff-add'> this.children_views = new widget.ViewList(this.add_child_view, this.remove_child_view, this);</span>&nbsp; <span class='diff-add'> this.listenTo(this.model, 'change:children', function(model, value) {</span>&nbsp; <span class='diff-add'> this.children_views.update(value);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> render: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var uuid = 'tabs'+utils.uuid();</span>&nbsp; <span class='diff-add'> this.$tabs = $('<div />', {id: uuid})</span>&nbsp; <span class='diff-add'> .addClass('nav')</span>&nbsp; <span class='diff-add'> .addClass('nav-tabs')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el);</span>&nbsp; <span class='diff-add'> this.$tab_contents = $('<div />', {id: uuid + 'Content'})</span>&nbsp; <span class='diff-add'> .addClass('tab-content')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el);</span>&nbsp; <span class='diff-add'> this.children_views.update(this.model.get('children'));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$tabs.css(name, value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> remove_child_view: function(view) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when a child is removed from children list.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.containers.splice(view.parent_tab.tab_text_index, 1);</span>&nbsp; <span class='diff-add'> view.parent_tab.remove();</span>&nbsp; <span class='diff-add'> view.parent_container.remove();</span>&nbsp; <span class='diff-add'> view.remove();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> add_child_view: function(model) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when a child is added to children list.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> var index = this.containers.length;</span>&nbsp; <span class='diff-add'> var uuid = utils.uuid();</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> var tab = $('<li />')</span>&nbsp; <span class='diff-add'> .css('list-style-type', 'none')</span>&nbsp; <span class='diff-add'> .appendTo(this.$tabs);</span>&nbsp; <span class='diff-add'> var tab_text = $('<a />')</span>&nbsp; <span class='diff-add'> .attr('href', '#' + uuid)</span>&nbsp; <span class='diff-add'> .attr('data-toggle', 'tab') </span>&nbsp; <span class='diff-add'> .text('Page ' + index)</span>&nbsp; <span class='diff-add'> .appendTo(tab)</span>&nbsp; <span class='diff-add'> .click(function (e) {</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> // Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> // model to update.</span>&nbsp; <span class='diff-add'> that.model.set("selected_index", index, {updated_view: that});</span>&nbsp; <span class='diff-add'> that.touch();</span>&nbsp; <span class='diff-add'> that.select_page(index);</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> tab.tab_text_index = that.containers.push(tab_text) - 1;</span>&nbsp; <span class='diff-add'> var dummy = $('<div />');</span>&nbsp; <span class='diff-add'> var contents_div = $('<div />', {id: uuid})</span>&nbsp; <span class='diff-add'> .addClass('tab-pane')</span>&nbsp; <span class='diff-add'> .addClass('fade')</span>&nbsp; <span class='diff-add'> .append(dummy)</span>&nbsp; <span class='diff-add'> .appendTo(that.$tab_contents);</span>&nbsp; <span class='diff-add'> this.update();</span>&nbsp; <span class='diff-add'> return this.create_child_view(model).then(function(view) {</span>&nbsp; <span class='diff-add'> dummy.replaceWith(view.$el);</span>&nbsp; <span class='diff-add'> view.parent_tab = tab;</span>&nbsp; <span class='diff-add'> view.parent_container = contents_div;</span>&nbsp; <span class='diff-add'> // Trigger the displayed event of the child view.</span>&nbsp; <span class='diff-add'> that.after_displayed(function() {</span>&nbsp; <span class='diff-add'> view.trigger('displayed');</span>&nbsp; <span class='diff-add'> that.update();</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return view;</span>&nbsp; <span class='diff-add'> }).catch(utils.reject("Couldn't add child view to box", true));</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update: function(options) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.update_titles();</span>&nbsp; <span class='diff-add'> this.update_selected_index(options);</span>&nbsp; <span class='diff-add'> return TabView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Updates the tab page titles.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> update_titles: function() {</span>&nbsp; <span class='diff-add'> var titles = this.model.get('_titles');</span>&nbsp; <span class='diff-add'> var that = this;</span>&nbsp; <span class='diff-add'> _.each(titles, function(title, page_index) {</span>&nbsp; <span class='diff-add'> var tab_text = that.containers[page_index];</span>&nbsp; <span class='diff-add'> if (tab_text !== undefined) {</span>&nbsp; <span class='diff-add'> tab_text.text(title);</span>&nbsp; <span class='diff-add'> } </span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Updates the tab page titles.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> update_selected_index: function(options) {</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> var selected_index = this.model.get('selected_index');</span>&nbsp; <span class='diff-add'> if (0 <= selected_index && selected_index < this.containers.length) {</span>&nbsp; <span class='diff-add'> this.select_page(selected_index);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> select_page: function(index) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Select a page.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$tabs.find('li')</span>&nbsp; <span class='diff-add'> .removeClass('active');</span>&nbsp; <span class='diff-add'> this.containers[index].tab('show');</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> remove: function() {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * We remove this widget before removing the children as an optimization</span>&nbsp; <span class='diff-add'> * we want to remove the entire container from the DOM first before</span>&nbsp; <span class='diff-add'> * removing each individual child separately.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> TabView.__super__.remove.apply(this, arguments);</span>&nbsp; <span class='diff-add'> this.children_views.remove();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'AccordionView': AccordionView,</span>&nbsp; <span class='diff-add'> 'TabView': TabView,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/widget_string.js b/ipynb/Array-feature-overlap-05_files/widget_string.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..81bd8e3</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/widget_string.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// Copyright (c) IPython Development Team.</span>&nbsp; <span class='diff-add'>// Distributed under the terms of the Modified BSD License.</span>&nbsp; <span class='diff-add'>define([</span>&nbsp; <span class='diff-add'> "widgets/js/widget",</span>&nbsp; <span class='diff-add'> "jquery",</span>&nbsp; <span class='diff-add'> "bootstrap",</span>&nbsp; <span class='diff-add'>], function(widget, $){</span>&nbsp; <span class='diff-add'> var HTMLView = widget.DOMWidgetView.extend({ </span>&nbsp; <span class='diff-add'> render : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.update(); // Set defaults.</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el.html(this.model.get('value')); // CAUTION! .html(...) CALL MANDITORY!!!</span>&nbsp; <span class='diff-add'> return HTMLView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var LatexView = widget.DOMWidgetView.extend({ </span>&nbsp; <span class='diff-add'> render : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.update(); // Set defaults.</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update : function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.typeset(this.$el, this.model.get('value'));</span>&nbsp; <span class='diff-add'> return LatexView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> }, </span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var TextareaView = widget.DOMWidgetView.extend({ </span>&nbsp; <span class='diff-add'> render: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .addClass('widget-hbox widget-textarea');</span>&nbsp; <span class='diff-add'> this.$label = $('<div />')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .addClass('widget-label')</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> this.$textbox = $('<textarea />')</span>&nbsp; <span class='diff-add'> .attr('rows', 5)</span>&nbsp; <span class='diff-add'> .addClass('widget-text form-control')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el);</span>&nbsp; <span class='diff-add'> this.update(); // Set defaults.</span>&nbsp; <span class='diff-add'> this.model.on('msg:custom', $.proxy(this._handle_textarea_msg, this));</span>&nbsp; <span class='diff-add'> this.model.on('change:placeholder', function(model, value, options) {</span>&nbsp; <span class='diff-add'> this.update_placeholder(value);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.update_placeholder();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> _handle_textarea_msg: function (content){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handle when a custom msg is recieved from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (content.method == "scroll_to_bottom") {</span>&nbsp; <span class='diff-add'> this.scroll_to_bottom(); </span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_placeholder: function(value) {</span>&nbsp; <span class='diff-add'> if (!value) {</span>&nbsp; <span class='diff-add'> value = this.model.get('placeholder');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.$textbox.attr('placeholder', value);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> scroll_to_bottom: function (){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Scroll the text-area view to the bottom.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$textbox.scrollTop(this.$textbox[0].scrollHeight);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update: function(options){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> this.$textbox.val(this.model.get('value'));</span>&nbsp; <span class='diff-add'> var disabled = this.model.get('disabled');</span>&nbsp; <span class='diff-add'> this.$textbox.prop('disabled', disabled);</span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> if (description.length === 0) {</span>&nbsp; <span class='diff-add'> this.$label.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.typeset(this.$label, description);</span>&nbsp; <span class='diff-add'> this.$label.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return TextareaView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$textbox.css(name, value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> events: {</span>&nbsp; <span class='diff-add'> // Dictionary of events and their handlers.</span>&nbsp; <span class='diff-add'> "keyup textarea" : "handleChanging",</span>&nbsp; <span class='diff-add'> "paste textarea" : "handleChanging",</span>&nbsp; <span class='diff-add'> "cut textarea" : "handleChanging"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> handleChanging: function(e) { </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handles and validates user input.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> * model to update.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.model.set('value', e.target.value, {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> var TextView = widget.DOMWidgetView.extend({ </span>&nbsp; <span class='diff-add'> render: function(){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Called when view is rendered.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.$el</span>&nbsp; <span class='diff-add'> .addClass('widget-hbox widget-text');</span>&nbsp; <span class='diff-add'> this.$label = $('<div />')</span>&nbsp; <span class='diff-add'> .addClass('widget-label')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el)</span>&nbsp; <span class='diff-add'> .hide();</span>&nbsp; <span class='diff-add'> this.$textbox = $('<input type="text" />')</span>&nbsp; <span class='diff-add'> .addClass('input')</span>&nbsp; <span class='diff-add'> .addClass('widget-text form-control')</span>&nbsp; <span class='diff-add'> .appendTo(this.$el);</span>&nbsp; <span class='diff-add'> this.update(); // Set defaults.</span>&nbsp; <span class='diff-add'> this.model.on('change:placeholder', function(model, value, options) {</span>&nbsp; <span class='diff-add'> this.update_placeholder(value);</span>&nbsp; <span class='diff-add'> }, this);</span>&nbsp; <span class='diff-add'> this.update_placeholder();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_placeholder: function(value) {</span>&nbsp; <span class='diff-add'> if (!value) {</span>&nbsp; <span class='diff-add'> value = this.model.get('placeholder');</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> this.$textbox.attr('placeholder', value);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> update: function(options){</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Update the contents of this view</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Called when the model is changed. The model may have been </span>&nbsp; <span class='diff-add'> * changed by another view or by a state update from the back-end.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (options === undefined || options.updated_view != this) {</span>&nbsp; <span class='diff-add'> if (this.$textbox.val() != this.model.get('value')) {</span>&nbsp; <span class='diff-add'> this.$textbox.val(this.model.get('value'));</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var disabled = this.model.get('disabled');</span>&nbsp; <span class='diff-add'> this.$textbox.prop('disabled', disabled);</span>&nbsp; <span class='diff-add'> var description = this.model.get('description');</span>&nbsp; <span class='diff-add'> if (description.length === 0) {</span>&nbsp; <span class='diff-add'> this.$label.hide();</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.typeset(this.$label, description);</span>&nbsp; <span class='diff-add'> this.$label.show();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return TextView.__super__.update.apply(this);</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> update_attr: function(name, value) {</span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Set a css attr of the widget view.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (name == 'padding' || name == 'margin') {</span>&nbsp; <span class='diff-add'> this.$el.css(name, value);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> this.$textbox.css(name, value);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> events: {</span>&nbsp; <span class='diff-add'> // Dictionary of events and their handlers.</span>&nbsp; <span class='diff-add'> "keyup input" : "handleChanging",</span>&nbsp; <span class='diff-add'> "paste input" : "handleChanging",</span>&nbsp; <span class='diff-add'> "cut input" : "handleChanging",</span>&nbsp; <span class='diff-add'> "keypress input" : "handleKeypress",</span>&nbsp; <span class='diff-add'> "blur input" : "handleBlur",</span>&nbsp; <span class='diff-add'> "focusout input" : "handleFocusOut"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> handleChanging: function(e) { </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handles user input.</span>&nbsp; <span class='diff-add'> *</span>&nbsp; <span class='diff-add'> * Calling model.set will trigger all of the other views of the </span>&nbsp; <span class='diff-add'> * model to update.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> this.model.set('value', e.target.value, {updated_view: this});</span>&nbsp; <span class='diff-add'> this.touch();</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> </span>&nbsp; <span class='diff-add'> handleKeypress: function(e) { </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Handles text submition</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (e.keyCode == 13) { // Return key</span>&nbsp; <span class='diff-add'> this.send({event: 'submit'});</span>&nbsp; <span class='diff-add'> e.stopPropagation();</span>&nbsp; <span class='diff-add'> e.preventDefault();</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> handleBlur: function(e) { </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Prevent a blur from firing if the blur was not user intended.</span>&nbsp; <span class='diff-add'> * This is a workaround for the return-key focus loss bug.</span>&nbsp; <span class='diff-add'> * TODO: Is the original bug actually a fault of the keyboard</span>&nbsp; <span class='diff-add'> * manager?</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (e.relatedTarget === null) {</span>&nbsp; <span class='diff-add'> e.stopPropagation();</span>&nbsp; <span class='diff-add'> e.preventDefault();</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> handleFocusOut: function(e) { </span>&nbsp; <span class='diff-add'> /**</span>&nbsp; <span class='diff-add'> * Prevent a blur from firing if the blur was not user intended.</span>&nbsp; <span class='diff-add'> * This is a workaround for the return-key focus loss bug.</span>&nbsp; <span class='diff-add'> */</span>&nbsp; <span class='diff-add'> if (e.relatedTarget === null) {</span>&nbsp; <span class='diff-add'> e.stopPropagation();</span>&nbsp; <span class='diff-add'> e.preventDefault();</span>&nbsp; <span class='diff-add'> return false;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> });</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> 'HTMLView': HTMLView,</span>&nbsp; <span class='diff-add'> 'LatexView': LatexView,</span>&nbsp; <span class='diff-add'> 'TextareaView': TextareaView,</span>&nbsp; <span class='diff-add'> 'TextView': TextView,</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/Array-feature-overlap-05_files/xml.js b/ipynb/Array-feature-overlap-05_files/xml.js</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..2f3b8f8</span>&nbsp; <span class='hidden' style='font-size:75%'>--- /dev/null</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/Array-feature-overlap-05_files/xml.js</span>&nbsp; <br><span class="hidden"> ... </span><br> <span class='diff-add'>// CodeMirror, copyright (c) by Marijn Haverbeke and others</span>&nbsp; <span class='diff-add'>// Distributed under an MIT license: http://codemirror.net/LICENSE</span>&nbsp; <span class='diff-add'>(function(mod) {</span>&nbsp; <span class='diff-add'> if (typeof exports == "object" && typeof module == "object") // CommonJS</span>&nbsp; <span class='diff-add'> mod(require("../../lib/codemirror"));</span>&nbsp; <span class='diff-add'> else if (typeof define == "function" && define.amd) // AMD</span>&nbsp; <span class='diff-add'> define(["../../lib/codemirror"], mod);</span>&nbsp; <span class='diff-add'> else // Plain browser env</span>&nbsp; <span class='diff-add'> mod(CodeMirror);</span>&nbsp; <span class='diff-add'>})(function(CodeMirror) {</span>&nbsp; <span class='diff-add'>"use strict";</span>&nbsp; <span class='diff-add'>CodeMirror.defineMode("xml", function(config, parserConfig) {</span>&nbsp; <span class='diff-add'> var indentUnit = config.indentUnit;</span>&nbsp; <span class='diff-add'> var multilineTagIndentFactor = parserConfig.multilineTagIndentFactor || 1;</span>&nbsp; <span class='diff-add'> var multilineTagIndentPastTag = parserConfig.multilineTagIndentPastTag;</span>&nbsp; <span class='diff-add'> if (multilineTagIndentPastTag == null) multilineTagIndentPastTag = true;</span>&nbsp; <span class='diff-add'> var Kludges = parserConfig.htmlMode ? {</span>&nbsp; <span class='diff-add'> autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,</span>&nbsp; <span class='diff-add'> 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,</span>&nbsp; <span class='diff-add'> 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,</span>&nbsp; <span class='diff-add'> 'track': true, 'wbr': true, 'menuitem': true},</span>&nbsp; <span class='diff-add'> implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,</span>&nbsp; <span class='diff-add'> 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,</span>&nbsp; <span class='diff-add'> 'th': true, 'tr': true},</span>&nbsp; <span class='diff-add'> contextGrabbers: {</span>&nbsp; <span class='diff-add'> 'dd': {'dd': true, 'dt': true},</span>&nbsp; <span class='diff-add'> 'dt': {'dd': true, 'dt': true},</span>&nbsp; <span class='diff-add'> 'li': {'li': true},</span>&nbsp; <span class='diff-add'> 'option': {'option': true, 'optgroup': true},</span>&nbsp; <span class='diff-add'> 'optgroup': {'optgroup': true},</span>&nbsp; <span class='diff-add'> 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,</span>&nbsp; <span class='diff-add'> 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,</span>&nbsp; <span class='diff-add'> 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,</span>&nbsp; <span class='diff-add'> 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,</span>&nbsp; <span class='diff-add'> 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},</span>&nbsp; <span class='diff-add'> 'rp': {'rp': true, 'rt': true},</span>&nbsp; <span class='diff-add'> 'rt': {'rp': true, 'rt': true},</span>&nbsp; <span class='diff-add'> 'tbody': {'tbody': true, 'tfoot': true},</span>&nbsp; <span class='diff-add'> 'td': {'td': true, 'th': true},</span>&nbsp; <span class='diff-add'> 'tfoot': {'tbody': true},</span>&nbsp; <span class='diff-add'> 'th': {'td': true, 'th': true},</span>&nbsp; <span class='diff-add'> 'thead': {'tbody': true, 'tfoot': true},</span>&nbsp; <span class='diff-add'> 'tr': {'tr': true}</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> doNotIndent: {"pre": true},</span>&nbsp; <span class='diff-add'> allowUnquoted: true,</span>&nbsp; <span class='diff-add'> allowMissing: true,</span>&nbsp; <span class='diff-add'> caseFold: true</span>&nbsp; <span class='diff-add'> } : {</span>&nbsp; <span class='diff-add'> autoSelfClosers: {},</span>&nbsp; <span class='diff-add'> implicitlyClosed: {},</span>&nbsp; <span class='diff-add'> contextGrabbers: {},</span>&nbsp; <span class='diff-add'> doNotIndent: {},</span>&nbsp; <span class='diff-add'> allowUnquoted: false,</span>&nbsp; <span class='diff-add'> allowMissing: false,</span>&nbsp; <span class='diff-add'> caseFold: false</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> var alignCDATA = parserConfig.alignCDATA;</span>&nbsp; <span class='diff-add'> // Return variables for tokenizers</span>&nbsp; <span class='diff-add'> var type, setStyle;</span>&nbsp; <span class='diff-add'> function inText(stream, state) {</span>&nbsp; <span class='diff-add'> function chain(parser) {</span>&nbsp; <span class='diff-add'> state.tokenize = parser;</span>&nbsp; <span class='diff-add'> return parser(stream, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> var ch = stream.next();</span>&nbsp; <span class='diff-add'> if (ch == "<") {</span>&nbsp; <span class='diff-add'> if (stream.eat("!")) {</span>&nbsp; <span class='diff-add'> if (stream.eat("[")) {</span>&nbsp; <span class='diff-add'> if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));</span>&nbsp; <span class='diff-add'> else return null;</span>&nbsp; <span class='diff-add'> } else if (stream.match("--")) {</span>&nbsp; <span class='diff-add'> return chain(inBlock("comment", "-->"));</span>&nbsp; <span class='diff-add'> } else if (stream.match("DOCTYPE", true, true)) {</span>&nbsp; <span class='diff-add'> stream.eatWhile(/[\w\._\-]/);</span>&nbsp; <span class='diff-add'> return chain(doctype(1));</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (stream.eat("?")) {</span>&nbsp; <span class='diff-add'> stream.eatWhile(/[\w\._\-]/);</span>&nbsp; <span class='diff-add'> state.tokenize = inBlock("meta", "?>");</span>&nbsp; <span class='diff-add'> return "meta";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> type = stream.eat("/") ? "closeTag" : "openTag";</span>&nbsp; <span class='diff-add'> state.tokenize = inTag;</span>&nbsp; <span class='diff-add'> return "tag bracket";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (ch == "&") {</span>&nbsp; <span class='diff-add'> var ok;</span>&nbsp; <span class='diff-add'> if (stream.eat("#")) {</span>&nbsp; <span class='diff-add'> if (stream.eat("x")) {</span>&nbsp; <span class='diff-add'> ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";");</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> ok = stream.eatWhile(/[\d]/) && stream.eat(";");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";");</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return ok ? "atom" : "error";</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> stream.eatWhile(/[^&<]/);</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function inTag(stream, state) {</span>&nbsp; <span class='diff-add'> var ch = stream.next();</span>&nbsp; <span class='diff-add'> if (ch == ">" || (ch == "/" && stream.eat(">"))) {</span>&nbsp; <span class='diff-add'> state.tokenize = inText;</span>&nbsp; <span class='diff-add'> type = ch == ">" ? "endTag" : "selfcloseTag";</span>&nbsp; <span class='diff-add'> return "tag bracket";</span>&nbsp; <span class='diff-add'> } else if (ch == "=") {</span>&nbsp; <span class='diff-add'> type = "equals";</span>&nbsp; <span class='diff-add'> return null;</span>&nbsp; <span class='diff-add'> } else if (ch == "<") {</span>&nbsp; <span class='diff-add'> state.tokenize = inText;</span>&nbsp; <span class='diff-add'> state.state = baseState;</span>&nbsp; <span class='diff-add'> state.tagName = state.tagStart = null;</span>&nbsp; <span class='diff-add'> var next = state.tokenize(stream, state);</span>&nbsp; <span class='diff-add'> return next ? next + " tag error" : "tag error";</span>&nbsp; <span class='diff-add'> } else if (/[\'\"]/.test(ch)) {</span>&nbsp; <span class='diff-add'> state.tokenize = inAttribute(ch);</span>&nbsp; <span class='diff-add'> state.stringStartCol = stream.column();</span>&nbsp; <span class='diff-add'> return state.tokenize(stream, state);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/);</span>&nbsp; <span class='diff-add'> return "word";</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function inAttribute(quote) {</span>&nbsp; <span class='diff-add'> var closure = function(stream, state) {</span>&nbsp; <span class='diff-add'> while (!stream.eol()) {</span>&nbsp; <span class='diff-add'> if (stream.next() == quote) {</span>&nbsp; <span class='diff-add'> state.tokenize = inTag;</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return "string";</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> closure.isInAttribute = true;</span>&nbsp; <span class='diff-add'> return closure;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function inBlock(style, terminator) {</span>&nbsp; <span class='diff-add'> return function(stream, state) {</span>&nbsp; <span class='diff-add'> while (!stream.eol()) {</span>&nbsp; <span class='diff-add'> if (stream.match(terminator)) {</span>&nbsp; <span class='diff-add'> state.tokenize = inText;</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> stream.next();</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return style;</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function doctype(depth) {</span>&nbsp; <span class='diff-add'> return function(stream, state) {</span>&nbsp; <span class='diff-add'> var ch;</span>&nbsp; <span class='diff-add'> while ((ch = stream.next()) != null) {</span>&nbsp; <span class='diff-add'> if (ch == "<") {</span>&nbsp; <span class='diff-add'> state.tokenize = doctype(depth + 1);</span>&nbsp; <span class='diff-add'> return state.tokenize(stream, state);</span>&nbsp; <span class='diff-add'> } else if (ch == ">") {</span>&nbsp; <span class='diff-add'> if (depth == 1) {</span>&nbsp; <span class='diff-add'> state.tokenize = inText;</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> state.tokenize = doctype(depth - 1);</span>&nbsp; <span class='diff-add'> return state.tokenize(stream, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return "meta";</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function Context(state, tagName, startOfLine) {</span>&nbsp; <span class='diff-add'> this.prev = state.context;</span>&nbsp; <span class='diff-add'> this.tagName = tagName;</span>&nbsp; <span class='diff-add'> this.indent = state.indented;</span>&nbsp; <span class='diff-add'> this.startOfLine = startOfLine;</span>&nbsp; <span class='diff-add'> if (Kludges.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))</span>&nbsp; <span class='diff-add'> this.noIndent = true;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function popContext(state) {</span>&nbsp; <span class='diff-add'> if (state.context) state.context = state.context.prev;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function maybePopContext(state, nextTagName) {</span>&nbsp; <span class='diff-add'> var parentTagName;</span>&nbsp; <span class='diff-add'> while (true) {</span>&nbsp; <span class='diff-add'> if (!state.context) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> parentTagName = state.context.tagName;</span>&nbsp; <span class='diff-add'> if (!Kludges.contextGrabbers.hasOwnProperty(parentTagName) ||</span>&nbsp; <span class='diff-add'> !Kludges.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {</span>&nbsp; <span class='diff-add'> return;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> popContext(state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function baseState(type, stream, state) {</span>&nbsp; <span class='diff-add'> if (type == "openTag") {</span>&nbsp; <span class='diff-add'> state.tagStart = stream.column();</span>&nbsp; <span class='diff-add'> return tagNameState;</span>&nbsp; <span class='diff-add'> } else if (type == "closeTag") {</span>&nbsp; <span class='diff-add'> return closeTagNameState;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> return baseState;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function tagNameState(type, stream, state) {</span>&nbsp; <span class='diff-add'> if (type == "word") {</span>&nbsp; <span class='diff-add'> state.tagName = stream.current();</span>&nbsp; <span class='diff-add'> setStyle = "tag";</span>&nbsp; <span class='diff-add'> return attrState;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> setStyle = "error";</span>&nbsp; <span class='diff-add'> return tagNameState;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function closeTagNameState(type, stream, state) {</span>&nbsp; <span class='diff-add'> if (type == "word") {</span>&nbsp; <span class='diff-add'> var tagName = stream.current();</span>&nbsp; <span class='diff-add'> if (state.context && state.context.tagName != tagName &&</span>&nbsp; <span class='diff-add'> Kludges.implicitlyClosed.hasOwnProperty(state.context.tagName))</span>&nbsp; <span class='diff-add'> popContext(state);</span>&nbsp; <span class='diff-add'> if (state.context && state.context.tagName == tagName) {</span>&nbsp; <span class='diff-add'> setStyle = "tag";</span>&nbsp; <span class='diff-add'> return closeState;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> setStyle = "tag error";</span>&nbsp; <span class='diff-add'> return closeStateErr;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> setStyle = "error";</span>&nbsp; <span class='diff-add'> return closeStateErr;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function closeState(type, _stream, state) {</span>&nbsp; <span class='diff-add'> if (type != "endTag") {</span>&nbsp; <span class='diff-add'> setStyle = "error";</span>&nbsp; <span class='diff-add'> return closeState;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> popContext(state);</span>&nbsp; <span class='diff-add'> return baseState;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function closeStateErr(type, stream, state) {</span>&nbsp; <span class='diff-add'> setStyle = "error";</span>&nbsp; <span class='diff-add'> return closeState(type, stream, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function attrState(type, _stream, state) {</span>&nbsp; <span class='diff-add'> if (type == "word") {</span>&nbsp; <span class='diff-add'> setStyle = "attribute";</span>&nbsp; <span class='diff-add'> return attrEqState;</span>&nbsp; <span class='diff-add'> } else if (type == "endTag" || type == "selfcloseTag") {</span>&nbsp; <span class='diff-add'> var tagName = state.tagName, tagStart = state.tagStart;</span>&nbsp; <span class='diff-add'> state.tagName = state.tagStart = null;</span>&nbsp; <span class='diff-add'> if (type == "selfcloseTag" ||</span>&nbsp; <span class='diff-add'> Kludges.autoSelfClosers.hasOwnProperty(tagName)) {</span>&nbsp; <span class='diff-add'> maybePopContext(state, tagName);</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> maybePopContext(state, tagName);</span>&nbsp; <span class='diff-add'> state.context = new Context(state, tagName, tagStart == state.indented);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return baseState;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> setStyle = "error";</span>&nbsp; <span class='diff-add'> return attrState;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function attrEqState(type, stream, state) {</span>&nbsp; <span class='diff-add'> if (type == "equals") return attrValueState;</span>&nbsp; <span class='diff-add'> if (!Kludges.allowMissing) setStyle = "error";</span>&nbsp; <span class='diff-add'> return attrState(type, stream, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function attrValueState(type, stream, state) {</span>&nbsp; <span class='diff-add'> if (type == "string") return attrContinuedState;</span>&nbsp; <span class='diff-add'> if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return attrState;}</span>&nbsp; <span class='diff-add'> setStyle = "error";</span>&nbsp; <span class='diff-add'> return attrState(type, stream, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> function attrContinuedState(type, stream, state) {</span>&nbsp; <span class='diff-add'> if (type == "string") return attrContinuedState;</span>&nbsp; <span class='diff-add'> return attrState(type, stream, state);</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return {</span>&nbsp; <span class='diff-add'> startState: function() {</span>&nbsp; <span class='diff-add'> return {tokenize: inText,</span>&nbsp; <span class='diff-add'> state: baseState,</span>&nbsp; <span class='diff-add'> indented: 0,</span>&nbsp; <span class='diff-add'> tagName: null, tagStart: null,</span>&nbsp; <span class='diff-add'> context: null};</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> token: function(stream, state) {</span>&nbsp; <span class='diff-add'> if (!state.tagName && stream.sol())</span>&nbsp; <span class='diff-add'> state.indented = stream.indentation();</span>&nbsp; <span class='diff-add'> if (stream.eatSpace()) return null;</span>&nbsp; <span class='diff-add'> type = null;</span>&nbsp; <span class='diff-add'> var style = state.tokenize(stream, state);</span>&nbsp; <span class='diff-add'> if ((style || type) && style != "comment") {</span>&nbsp; <span class='diff-add'> setStyle = null;</span>&nbsp; <span class='diff-add'> state.state = state.state(type || style, stream, state);</span>&nbsp; <span class='diff-add'> if (setStyle)</span>&nbsp; <span class='diff-add'> style = setStyle == "error" ? style + " error" : setStyle;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> return style;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> indent: function(state, textAfter, fullLine) {</span>&nbsp; <span class='diff-add'> var context = state.context;</span>&nbsp; <span class='diff-add'> // Indent multi-line strings (e.g. css).</span>&nbsp; <span class='diff-add'> if (state.tokenize.isInAttribute) {</span>&nbsp; <span class='diff-add'> if (state.tagStart == state.indented)</span>&nbsp; <span class='diff-add'> return state.stringStartCol + 1;</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> return state.indented + indentUnit;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (context && context.noIndent) return CodeMirror.Pass;</span>&nbsp; <span class='diff-add'> if (state.tokenize != inTag && state.tokenize != inText)</span>&nbsp; <span class='diff-add'> return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;</span>&nbsp; <span class='diff-add'> // Indent the starts of attribute names.</span>&nbsp; <span class='diff-add'> if (state.tagName) {</span>&nbsp; <span class='diff-add'> if (multilineTagIndentPastTag)</span>&nbsp; <span class='diff-add'> return state.tagStart + state.tagName.length + 2;</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> return state.tagStart + indentUnit * multilineTagIndentFactor;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> if (alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0;</span>&nbsp; <span class='diff-add'> var tagAfter = textAfter && /^<(\/)?([\w_:\.-]*)/.exec(textAfter);</span>&nbsp; <span class='diff-add'> if (tagAfter && tagAfter[1]) { // Closing tag spotted</span>&nbsp; <span class='diff-add'> while (context) {</span>&nbsp; <span class='diff-add'> if (context.tagName == tagAfter[2]) {</span>&nbsp; <span class='diff-add'> context = context.prev;</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> } else if (Kludges.implicitlyClosed.hasOwnProperty(context.tagName)) {</span>&nbsp; <span class='diff-add'> context = context.prev;</span>&nbsp; <span class='diff-add'> } else {</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> } else if (tagAfter) { // Opening tag spotted</span>&nbsp; <span class='diff-add'> while (context) {</span>&nbsp; <span class='diff-add'> var grabbers = Kludges.contextGrabbers[context.tagName];</span>&nbsp; <span class='diff-add'> if (grabbers && grabbers.hasOwnProperty(tagAfter[2]))</span>&nbsp; <span class='diff-add'> context = context.prev;</span>&nbsp; <span class='diff-add'> else</span>&nbsp; <span class='diff-add'> break;</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> while (context && !context.startOfLine)</span>&nbsp; <span class='diff-add'> context = context.prev;</span>&nbsp; <span class='diff-add'> if (context) return context.indent + indentUnit;</span>&nbsp; <span class='diff-add'> else return 0;</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> electricInput: /<\/[\s\w:]+>$/,</span>&nbsp; <span class='diff-add'> blockCommentStart: "<!--",</span>&nbsp; <span class='diff-add'> blockCommentEnd: "-->",</span>&nbsp; <span class='diff-add'> configuration: parserConfig.htmlMode ? "html" : "xml",</span>&nbsp; <span class='diff-add'> helperType: parserConfig.htmlMode ? "html" : "xml"</span>&nbsp; <span class='diff-add'> };</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='diff-add'>CodeMirror.defineMIME("text/xml", "xml");</span>&nbsp; <span class='diff-add'>CodeMirror.defineMIME("application/xml", "xml");</span>&nbsp; <span class='diff-add'>if (!CodeMirror.mimeModes.hasOwnProperty("text/html"))</span>&nbsp; <span class='diff-add'> CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true});</span>&nbsp; <span class='diff-add'>});</span>&nbsp; <span class='hidden' style='font-size:75%'>diff --git a/ipynb/analyses/hypo-hyper-overlap.xlsx b/ipynb/analyses/hypo-hyper-overlap.xlsx</span>&nbsp; <span class='hidden' style='font-size:75%'>index 2551a6f..f887f48 100644</span>&nbsp; Binary files a/ipynb/analyses/hypo-hyper-overlap.xlsx and b/ipynb/analyses/hypo-hyper-overlap.xlsx differ <span class='hidden' style='font-size:75%'>diff --git a/ipynb/scratch.ipynb b/ipynb/scratch.ipynb</span>&nbsp; <span class='hidden' style='font-size:75%'>index 6ebfab4..b97cb4d 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>--- a/ipynb/scratch.ipynb</span>&nbsp; <span class='hidden' style='font-size:75%'>+++ b/ipynb/scratch.ipynb</span>&nbsp; <br><span class="hidden"> ... </span><br> {</span>&nbsp; <span class='diff-rem'>"metadata": {</span>&nbsp; <span class='diff-rem'> "name": "",</span>&nbsp; <span class='diff-rem'> "signature": "sha256:7be4f3553aafdb8e31c7929bb02e8cb8ad9796a1ffc611c8497433e0a976a1e0"</span>&nbsp; <span class='diff-rem'> },</span>&nbsp; <span class='diff-rem'> "nbformat": 3,</span>&nbsp; <span class='diff-rem'> "nbformat_minor": 0,</span>&nbsp; <span class='diff-rem'> "worksheets":</span>&nbsp;<span class='diff-add'>"cells":</span>&nbsp; [ {</span>&nbsp; <span class='diff-rem'>"cells": [</span>&nbsp; <span class='diff-rem'> {</span>&nbsp; "cell_type": "code", <span class='diff-rem'>"collapsed": false,</span>&nbsp; <span class='diff-rem'> "input": [</span>&nbsp; <span class='diff-rem'> "!head /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/*sig*"</span>&nbsp; <span class='diff-rem'> ],</span>&nbsp; <span class='diff-rem'> "language": "python",</span>&nbsp;<span class='diff-add'>"execution_count": 6,</span>&nbsp; "metadata":<span class='diff-rem'>{},</span>&nbsp; <span class='diff-rem'> "outputs": [</span>&nbsp; { <span class='diff-rem'>"output_type": "stream",</span>&nbsp; <span class='diff-rem'> "stream": "stdout",</span>&nbsp; <span class='diff-rem'> "text": [</span>&nbsp; <span class='diff-rem'> "==> /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.2M_sig.bedGraph <==\r\n",</span>&nbsp; <span class='diff-rem'> "track type=bedGraph name=\"2M_sig\" description=\"2M_sig\" visibility=full color=100,100,0 altColor=0,100,200 priority=20\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t163391\t163444\t-1.19635354862016\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t167390\t167448\t-1.34858424227208\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t177036\t177092\t-1.32513261026528\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t180263\t180313\t-1.59644601437398\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t184151\t184202\t-1.36802539236446\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t207852\t207911\t-1.4489540693628\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t221645\t221697\t-1.19168816975966\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold100\t20261\t20311\t-1.38705592724581\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold100\t43707\t43766\t-1.94554287545546\r\n",</span>&nbsp; <span class='diff-rem'> "\r\n",</span>&nbsp; <span class='diff-rem'> "==> /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.4M_sig.bedGraph <==\r\n",</span>&nbsp; <span class='diff-rem'> "track type=bedGraph name=\"4M_sig\" description=\"4M_sig\" visibility=full color=100,100,0 altColor=0,100,200 priority=20\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t55723\t55780\t-1.14983078196614\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t162896\t162952\t1.31051906307266\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t165162\t165215\t-1.24601772855566\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t171392\t171453\t-1.22260744814979\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t174020\t174073\t1.13065801555915\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t174287\t174343\t-1.69319890151177\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t176273\t176334\t-1.72785163633438\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t178210\t178267\t1.2199265031441\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t183256\t183318\t-1.30551922539134\r\n",</span>&nbsp; <span class='diff-rem'> "\r\n",</span>&nbsp; <span class='diff-rem'> "==> /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/2014.07.02.colson/genomeBrowserTracks/logFC_HS-preHS/2014.07.02.6M_sig.bedGraph <==\r\n",</span>&nbsp; <span class='diff-rem'> "track type=bedGraph name=\"6M_sig\" description=\"6M_sig\" visibility=full color=100,100,0 altColor=0,100,200 priority=20\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t54599\t54654\t-1.38187662416007\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t162129\t162191\t1.85685479189849\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t163536\t163586\t-1.15032035523765\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t172654\t172714\t1.33561271440876\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t174287\t174343\t-1.62903936976887\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t178075\t178128\t1.42323539316231\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t178685\t178740\t1.30886296151914\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t184271\t184330\t-1.20699853451878\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1\t184661\t184715\t-1.61107459826899\r\n"</span>&nbsp; <span class='diff-rem'> ]</span>&nbsp; <span class='diff-rem'> }</span>&nbsp; <span class='diff-rem'> ],</span>&nbsp; <span class='diff-rem'> "prompt_number": 3</span>&nbsp;<span class='diff-add'>"collapsed": false</span>&nbsp; }, <span class='diff-add'>"outputs": [</span>&nbsp; {</span>&nbsp; <span class='diff-rem'>"cell_type": "code",</span>&nbsp; <span class='diff-rem'> "collapsed": false,</span>&nbsp; <span class='diff-rem'> "input": [</span>&nbsp; <span class='diff-rem'> "!sort /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/canonical/4M_3plusmerge_Hyper.bed"</span>&nbsp; <span class='diff-rem'> ],</span>&nbsp; <span class='diff-rem'> "language": "python",</span>&nbsp; <span class='diff-rem'> "metadata": {},</span>&nbsp; <span class='diff-rem'> "outputs": [</span>&nbsp; <span class='diff-rem'> {</span>&nbsp;<span class='diff-add'>"ename": "SyntaxError",</span>&nbsp; <span class='diff-add'> "evalue": "invalid syntax (<ipython-input-6-39d947ddb079>, line 2)",</span>&nbsp; "output_type": <span class='diff-rem'>"stream",</span>&nbsp; <span class='diff-rem'> "stream": "stdout",</span>&nbsp; <span class='diff-rem'> "text":</span>&nbsp;<span class='diff-add'>"error",</span>&nbsp; <span class='diff-add'> "traceback":</span>&nbsp; [ <span class='diff-rem'>"scaffold1241\t28111\t28419\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1447\t305772\t306206\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold1805\t257176\t257496\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold257\t1235165\t1235481\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold40230\t41604\t41898\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold41982\t74367\t74671\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold63\t426683\t426993\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold70\t774778\t775094\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold801\t338037\t338345\r\n",</span>&nbsp; <span class='diff-rem'> "scaffold801\t339443\t339729\r\n"</span>&nbsp;<span class='diff-add'>"\u001b[0;36m File \u001b[0;32m\"<ipython-input-6-39d947ddb079>\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m ipython nbconvert --to FORMAT notebook.ipynb\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"</span>&nbsp; ] } ], <span class='diff-rem'>"prompt_number": 5</span>&nbsp;<span class='diff-add'>"source": [</span>&nbsp; <span class='diff-add'> "%bash\n",</span>&nbsp; <span class='diff-add'> "ipython nbconvert --to FORMAT notebook.ipynb"</span>&nbsp; <span class='diff-add'> ]</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "cell_type": "code",</span>&nbsp; <span class='diff-add'> "execution_count": 5,</span>&nbsp; <span class='diff-add'> "metadata": {</span>&nbsp; <span class='diff-add'> "collapsed": false</span>&nbsp; }, <span class='diff-add'>"outputs": [</span>&nbsp; {</span>&nbsp; <span class='diff-rem'>"cell_type": "code",</span>&nbsp; <span class='diff-rem'> "collapsed": false,</span>&nbsp; <span class='diff-rem'> "input": [],</span>&nbsp; <span class='diff-rem'> "language": "python",</span>&nbsp; <span class='diff-rem'> "metadata": {},</span>&nbsp; <span class='diff-rem'> "outputs": []</span>&nbsp;<span class='diff-add'>"name": "stdout",</span>&nbsp; <span class='diff-add'> "output_type": "stream",</span>&nbsp; <span class='diff-add'> "text": [</span>&nbsp; <span class='diff-add'> "scaffold1241\t28111\t28419\r\n",</span>&nbsp; <span class='diff-add'> "scaffold1447\t305772\t306206\r\n",</span>&nbsp; <span class='diff-add'> "scaffold1805\t257176\t257496\r\n",</span>&nbsp; <span class='diff-add'> "scaffold257\t1235165\t1235481\r\n",</span>&nbsp; <span class='diff-add'> "scaffold40230\t41604\t41898\r\n",</span>&nbsp; <span class='diff-add'> "scaffold41982\t74367\t74671\r\n",</span>&nbsp; <span class='diff-add'> "scaffold63\t426683\t426993\r\n",</span>&nbsp; <span class='diff-add'> "scaffold70\t774778\t775094\r\n",</span>&nbsp; <span class='diff-add'> "scaffold801\t338037\t338345\r\n",</span>&nbsp; <span class='diff-add'> "scaffold801\t339443\t339729\r\n"</span>&nbsp; <span class='diff-add'> ]</span>&nbsp; }</span>&nbsp; ],</span>&nbsp; <span class='diff-add'>"source": [</span>&nbsp; <span class='diff-add'> "!sort /Users/sr320/git-repos/paper-Temp-stress/ipynb/data/canonical/4M_3plusmerge_Hyper.bed"</span>&nbsp; <span class='diff-add'> ]</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> {</span>&nbsp; <span class='diff-add'> "cell_type": "code",</span>&nbsp; <span class='diff-add'> "execution_count": null,</span>&nbsp; "metadata": <span class='diff-rem'>{}</span>&nbsp;<span class='diff-add'>{</span>&nbsp; <span class='diff-add'> "collapsed": false</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> "outputs": [],</span>&nbsp; <span class='diff-add'> "source": []</span>&nbsp; }</span>&nbsp; <span class='diff-rem'>]</span>&nbsp;<span class='diff-add'>],</span>&nbsp; <span class='diff-add'> "metadata": {</span>&nbsp; <span class='diff-add'> "kernelspec": {</span>&nbsp; <span class='diff-add'> "display_name": "Python 2",</span>&nbsp; <span class='diff-add'> "language": "python",</span>&nbsp; <span class='diff-add'> "name": "python2"</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> "language_info": {</span>&nbsp; <span class='diff-add'> "codemirror_mode": {</span>&nbsp; <span class='diff-add'> "name": "ipython",</span>&nbsp; <span class='diff-add'> "version": 2</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> "file_extension": ".py",</span>&nbsp; <span class='diff-add'> "mimetype": "text/x-python",</span>&nbsp; <span class='diff-add'> "name": "python",</span>&nbsp; <span class='diff-add'> "nbconvert_exporter": "python",</span>&nbsp; <span class='diff-add'> "pygments_lexer": "ipython2",</span>&nbsp; <span class='diff-add'> "version": "2.7.9"</span>&nbsp; <span class='diff-add'> }</span>&nbsp; <span class='diff-add'> },</span>&nbsp; <span class='diff-add'> "nbformat": 4,</span>&nbsp; <span class='diff-add'> "nbformat_minor": 0</span>&nbsp; } <span class='hidden' style='font-size:75%'>diff --git a/notes/hyper-splitting.md b/notes/hyper-splitting.md</span>&nbsp; <span class='hidden' style='font-size:75%'>new file mode 100644</span>&nbsp; <span class='hidden' style='font-size:75%'>index 0000000..e69de29</span>&nbsp;